home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / cat.m < prev    next >
Text File  |  1997-10-26  |  95KB  |  2,608 lines

  1. MODULE Cat;
  2.  
  3. (*==============================================================*
  4.  * Modul:               CAT-Hauptmodul                          *
  5.  * Autor:               Johannes G”ttker-Schnetmann, Dirk Steins*
  6.  * erstellt am:         Mai 1990                                *
  7.  * letzte Žnderung am:  30.11.1993                              *
  8.  * Version:             2.52                                    *
  9.  * Interne Version:     V#0075                                  *
  10.  *==============================================================*
  11.  
  12.  Ich habe eben beim Durchsehen noch einige alte Konventionen gefunden, mal
  13.  sehen, da muž ich noch einiges moderniseren, damit "data" nicht wieder
  14.  ein Pfusch wird. Wahrscheinlich werde ich auch die interne Nummerierung
  15.  der Gruppen umstellen, d.h. private = 0, alles andere ab 1 aufsteigend,
  16.  das scheint mir zukunftssicher.
  17.  
  18.  Žchtung: Jetzt kann es wegen der Nummerierung von 'private' #
  19.  'privateMessages' noch Probleme geben!
  20.  
  21.  Unter anderem sind die Array's Gruppe und SpezGr samt Initialisierung
  22.  jetzt rausgeflogen, allerdings zeigt die Gruppenbox jetzt die Anzahl der
  23.  neuen noch nicht richtig an, das muž auch noch behoben werden.
  24.  
  25.  Weitere Kompromisse fr den šbergang:
  26.  1. bzgl. data/MTDatabase-šbergang
  27.  - data.InitDatabase(), data.readPos() und data.writePos() liefern Ergebnis,
  28.    das auf den Mll geworfen wird
  29.  - KillTo, KillOneGroup nicht verfgbar, ausgeklammert
  30.  - SetNewState gibt's auch noch nicht
  31.  
  32.  2. bzgl grin/MTVDIAnzeige
  33.  - StartPos Nummer/Datum noch nicht implementiert
  34.  - Marken setzen nicht m”glich (alternate-Zahl)
  35.  - "conversion ", "stichWort", "FromName" .. :-))) Das war natrlich v”lliger
  36.    Pfusch
  37.  - ShowVDIHeader gibt's noch nicht
  38.  - IsHeaderWinTop
  39.  - FontSelect HeaderFont (gibt's natrlich noch garnicht)
  40.  - PrintMessage/SaveMessage
  41.  - NewOut (Streichen?), ResetInternalState, SearchMenuSelected,
  42.    QuoteBlock, WriteInfoLine, DoSearch, GetActualUser, CheckInfoLine, "msgHandle"
  43.  
  44.  *----------------------------------------------------------------------------
  45.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)
  46.  *----------------------------------------------------------------------------
  47.  * ??? Mitte 1990 bis Dezember 1991 diverses..
  48.  * 22.12.91       JGS    rudiment„re Anpassung an neues Datenbankmodul "data"
  49.  *                       und Anzeige "grin"
  50.  * 25.02.92       JGS    Anpassung der letzten diffs an mein 'neues' Hauptmodul
  51.  *                       unter Bercksichtigung der neuen Datenbank/Anzeige
  52.  * 07.03.92 -
  53.  * 09.03.92 0003  JGS    Diverse Anpassungen, u.a. MTEdit2 soweit wie m”glich
  54.  *                       entfernt, besserer Programmstart, schnellere Hauptschleife
  55.  * 22.03.92       JGS    Parser eingebaut
  56.  * 01.04.92       JGS    Einige Kleinigkeiten angepažt, u.a. InvertStatus
  57.  * 02.04.92       JGS    Status bei pers”nlichen Msgs
  58.  *----------------------------------------------------------------------------
  59.  *)
  60.  
  61. (* Fr Fehlerbehandlung unter der Shell: *)
  62. FROM PrgCtrl            IMPORT CatchProcessTerm, TermCarrier;
  63. FROM MOSGlobals         IMPORT MemArea;
  64.  
  65. FROM MathLib0           IMPORT pi, cos, sin, int;
  66. IMPORT MathLib0, FileNames;
  67. FROM SysUtil2           IMPORT SetJump, LongJump, JumpBuf;
  68.  
  69. FROM SYSTEM             IMPORT ADDRESS, ADR, CODE, CADR, ASSEMBLER, TSIZE, CALLSYS, BYTE;
  70. IMPORT BinOps;
  71. FROM Storage            IMPORT ALLOCATE, DEALLOCATE, AllAvail;
  72. FROM Characters         IMPORT CR, LF;
  73. FROM SwapServer         IMPORT SplitWordToByte, SmallerCard, SmallerInt;
  74. FROM Messages           IMPORT NewMessage, NewPersMsg;
  75. FROM MsgInfile          IMPORT MakeInFile;
  76. FROM Infofiles          IMPORT LoadInfoInf;
  77. FROM InfoDlg            IMPORT doInfoList;
  78. FROM MTPaths            IMPORT ARCPath, MessagePath, ImportPath,
  79.                                ExportPath, DataPath, TerminalPath, ARCName,
  80.                                archiveName, TerminalName, enarcStr,
  81.                                dearcStr, TerminalCmd, ReadInf, lastInfName;
  82. FROM MTEdit2            IMPORT OpenEditWindow;
  83. IMPORT CatEdit;
  84. FROM UserInformation    IMPORT UserBLK, ReadUserBlock, 
  85.                                batchProcess;
  86. FROM VDIUtil            IMPORT FormHandle;
  87. FROM VDIStandards       IMPORT SetState, SetSpec, SetFlags, GetSpec,
  88.                                GetState, InitVDIStandards,
  89.                                SelectFont, StatusEnable, 
  90.                                enableMenuItems, enableNewTop, CheckItem;
  91. FROM CatFiles           IMPORT OpenFile, openMode, ReadFile, CloseFile,
  92.                                ClearPath, DeleteFile, SetPath, Seek,
  93.                                WriteMuch, SeekMode, WriteFile, ErrorAlert,
  94.                                FileSize;
  95. FROM Void               IMPORT v;
  96. FROM ZSearchDial        IMPORT InitMenuStr, FlagDial, DialAction, DialActionSet;
  97. FROM ConvertDate        IMPORT DateOk;
  98. FROM Protokoll          IMPORT IsProtokoll, React, SendTerminate, SendHelp, 
  99.                                SendProgstart, ProtoInit, SendAcknowledge,
  100.                                CatReadMsgInfo, SendExtendedHelp,
  101.                                SendPrintFile;
  102. FROM CatButtons         IMPORT DisplayButton, CloseButton, ClickIsInButton,
  103.                                InitButtonWindow, DrawButton, IsButtonTop,
  104.                                buttonWindowLocked;
  105.  
  106.  
  107. FROM SearchMenu         IMPORT MenuSearch;
  108. IMPORT ShellCall;
  109. IMPORT GruppenAuswahl;
  110.  
  111. (* MM2-Module *)
  112. IMPORT StrConv;         (* wird eh von MagicConvert importiert *)
  113. IMPORT Block;           (* Wird auch vom Editor benutzt *)
  114.  
  115. (* ListBox *)
  116. IMPORT Lists;
  117. IMPORT Strings;
  118.  
  119. IMPORT MTE;
  120. IMPORT MausTauschrsc;
  121.  
  122. (* MagicLib *)
  123. IMPORT MagicAES;
  124. IMPORT MagicVDI;
  125. IMPORT MagicDOS;
  126. IMPORT MagicXBIOS;
  127. IMPORT MagicStrings;
  128. IMPORT MagicConvert;
  129. IMPORT MagicSys;
  130. IMPORT MagicCookie;
  131.  
  132. (* MagicTools *)
  133. IMPORT mtAppl;
  134. IMPORT mtCommand;
  135. IMPORT mtUtils;
  136. IMPORT mtDials;
  137. IMPORT mtDir;
  138. IMPORT mtAlerts;
  139. IMPORT mtPopups;
  140. IMPORT mtTextfiles;
  141. IMPORT mtRsc;
  142. IMPORT mtAESMenus;
  143.  
  144. (* Mint-Module *)
  145. IMPORT MintUtil;
  146. IMPORT Mintbind;
  147.  
  148. (* CAT-Module *)
  149. FROM CatGlobal  IMPORT magIx, magIxVer, multiGEM, multiTOS, multiTask, minTos14, 
  150.                        saveAllPositions, isMintDomain;
  151. IMPORT CatFiles;
  152. IMPORT FontSelect;
  153. IMPORT WdwManager;
  154. IMPORT ConfVars;
  155. IMPORT Printer;
  156.  
  157. IMPORT data;
  158. IMPORT dataSys;
  159. IMPORT grin;
  160. IMPORT Parser;
  161. IMPORT CatTypes;
  162. IMPORT CatGlobal;
  163. IMPORT Clip;
  164. IMPORT ListHelp;
  165. IMPORT grinTools;
  166. IMPORT ConvertDate;
  167. IMPORT msgList;                         (* Neues Stichwortlistenmodul *)
  168. IMPORT Messages;                        (* Base-Routinen fr neue Nachrichten  *)
  169. IMPORT MsgWindow;                       (* Windowhandling fr neue Nachrichten  *)
  170. IMPORT Varnames;                        (* Variablennamen fr CFG-Variablen *)
  171. IMPORT CatHelp;                         (* Einfache Hilfestellung in Dialogbox *)
  172. IMPORT CatButtons;                      (* Das ButtonWindow-Module *)
  173. IMPORT treeList;                        (* Graphische Kommentarb„ume *)
  174. IMPORT ZCalcCrc;
  175. IMPORT CatOpts;
  176. IMPORT CatOpts2;
  177. IMPORT CatUtil;
  178. IMPORT GroupSelect;
  179. IMPORT WinDials;
  180. IMPORT DoITK;
  181. IMPORT WiederVorlage;
  182.  
  183.  
  184. CONST   
  185.         magicPCCookie = 'MgPC';
  186.  
  187. CONST   sysStrOne       = 'Shell aufrufen';
  188.  
  189.         (* Anzeigestrings fr Loadbox *)
  190.         cInitInf    = "Lese CAT.INF";
  191.         cInitConfig = "Lese Konfigurationsdatei";
  192.         cInitGrin   = "Initialisiere Anzeigemodul";
  193.         cInitGroups = "Initialisiere Gruppenliste";
  194.         cInitData   = "Initialisiere Datenbank";
  195.         cInitPrint  = "Lese Druckerkonfiguration";
  196.         cInitMsgMan = "Initialisiere Nachrichtenmanager";
  197.         cInitInfos  = "Initialisiere Infodateien";
  198.         cInitList   = "Initialisiere Stichwortlistenmodul";
  199.         cInitNames  = "Sortiere Namensliste";
  200.         cInitButton = "Initialisiere Funktionsfenster";
  201.         cInitRsc    = "Initialisiere Resource";
  202.         cInitClip   = "Initialisiere Clipboard";
  203.         cInitDials  = "Initialisiere Gruppendialoge";
  204.  
  205.      CFGName    = 'printer.cfg';
  206.      allWild    = '*.*';
  207.  
  208. TYPE String     = ARRAY[0..79] OF CHAR;
  209.      StringPtr  = POINTER TO String;
  210.  
  211. VAR menu,
  212.     desk,
  213.     gruppen,
  214.     wegen,
  215.     about,
  216.     adr,
  217.     groups,
  218.     system      : ADDRESS;
  219.     BMess       : BOOLEAN;
  220.     neoDeskBugFix: BOOLEAN;
  221.     mayUseHidden : BOOLEAN;
  222.  
  223. VAR L         : LONGCARD;
  224.     j,t, win  : INTEGER;
  225.  
  226.     moX, moY  : INTEGER;
  227.     moButton  : BITSET;
  228.     kReturn   : INTEGER;
  229.     moKState  : BITSET;
  230.     bReturn   : INTEGER;
  231.     lastEvent,
  232.     event     : BITSET;
  233.     e         : BITSET;
  234.     mess,
  235.     mScrap    : ARRAY[0..7] OF INTEGER;
  236.     scan,
  237.     char      : CHAR;
  238.     dr, mrect : RECORD
  239.                   CASE :BOOLEAN OF
  240.                     TRUE : x,y,w,h : INTEGER|
  241.                     FALSE: adr, dum: ADDRESS
  242.                   END
  243.                 END;
  244.     null      : RECORD d1,d2 : LONGCARD END;
  245.     startTerm : BOOLEAN;
  246.     termStarted : BOOLEAN;
  247.     mouse     : BOOLEAN;
  248.     dontSwitchOffMouse : BOOLEAN;   (* Nur nicht die Maus ausschalten *)
  249.     EndOfPrg  : BOOLEAN;
  250.     fastExit  : BOOLEAN;
  251.     lastApId  : INTEGER;
  252.     chPid,
  253.     termPid   : INTEGER;
  254.     shell     : ShellCall.shellType;
  255.  
  256.     ButtonWindowOpen : BOOLEAN;
  257.     conState         : CARDINAL;
  258.     
  259.     catDTA           : MagicDOS.DTA;
  260.     
  261.     filterNumber     : INTEGER;
  262.     catCheckJumpBuf  : JumpBuf;
  263.  
  264.  
  265. VAR (* Fr die FlagBox *)
  266.     setBits, clearBits : BITSET;
  267.     lastAction         : DialAction;
  268.  
  269. (* Kleiner Stack fr Keyboard-Events *)
  270. CONST   maxKeys = 16;
  271. TYPE    kbdEvent    = RECORD
  272.                         kstate : BITSET;
  273.                         scan   : CHAR;
  274.                         ch     : CHAR;
  275.                       END;
  276. VAR keyStack    : ARRAY [0..maxKeys-1] OF kbdEvent;
  277.     keyWrite    : INTEGER;
  278.     keyRead     : INTEGER;
  279.  
  280. PROCEDURE PopKey (VAR ks: BITSET; VAR sc : CHAR; VAR c : CHAR);
  281. BEGIN
  282.   IF keyRead # keyWrite THEN
  283.     WITH keyStack[keyRead] DO
  284.       ks   := kstate;
  285.       sc   := scan;
  286.       c    := ch;
  287.     END;
  288.     keyRead := (keyRead + 1) MOD maxKeys;
  289.   END;
  290. END PopKey;
  291.  
  292. PROCEDURE PushKey (ks: BITSET; sc, c : CHAR);
  293. BEGIN
  294.   WITH keyStack[keyWrite] DO
  295.     kstate := ks;
  296.     scan   := sc;
  297.     ch     := c;
  298.   END;
  299.   keyWrite := (keyWrite + 1) MOD maxKeys;
  300.   IF keyWrite = keyRead THEN 
  301.     (* hat keyRead eingeholt, einmal rum! 
  302.      * keyRead auf n„chsten setzen 
  303.      *)
  304.     keyRead := (keyWrite + 1) MOD maxKeys;
  305.   END;
  306. END PushKey;
  307.  
  308. PROCEDURE PendingKey (): BOOLEAN;
  309. BEGIN
  310.   RETURN keyRead # keyWrite;
  311. END PendingKey;
  312.  
  313. PROCEDURE InitRsc():BOOLEAN;
  314. VAR z         : CARDINAL;
  315.     bp        : CARDINAL;
  316.  
  317.     (* Ein paar Baumadressen, die hier nur tempor„r gebraucht werden *)
  318.     colPopup  : ADDRESS;
  319.     verStr    : ARRAY [0..20] OF CHAR;
  320.  
  321. BEGIN
  322.   menu      := MausTauschrsc.TreeAddr^[MausTauschrsc.menu];
  323.   desk      := MausTauschrsc.TreeAddr^[MausTauschrsc.desk];
  324.   gruppen   := MausTauschrsc.TreeAddr^[MausTauschrsc.gruppen];
  325.   wegen     := MausTauschrsc.TreeAddr^[MausTauschrsc.wegen];
  326.   about     := MausTauschrsc.TreeAddr^[MausTauschrsc.about];
  327.   adr       := MausTauschrsc.TreeAddr^[MausTauschrsc.adr];
  328.   groups    := MausTauschrsc.TreeAddr^[MausTauschrsc.groups];
  329.   system    := MausTauschrsc.TreeAddr^[MausTauschrsc.system];
  330.   colPopup  := MausTauschrsc.TreeAddr^[MausTauschrsc.colpopup];
  331.  
  332.   IF ~InitMenuStr()             THEN RETURN FALSE END;
  333.  
  334.   shell := ShellCall.IsShell();
  335.   IF shell = ShellCall.noShell THEN SetState(menu, MausTauschrsc.callshel, {MagicAES.DISABLED}) END;
  336.   
  337.   SetSpec(about, MausTauschrsc.date, CADR(CatTypes.CatDate));
  338.   SetSpec(about, MausTauschrsc.date, CADR(CatTypes.CatDate));
  339.   SetSpec(about, MausTauschrsc.version, CADR(CatTypes.CatVersion));
  340.   
  341.   MagicStrings.Assign ("CAT " + CatTypes.CatVersion, verStr);
  342.   mtUtils.SetObjcString (MausTauschrsc.TreeAddr^[MausTauschrsc.cat_icon], MausTauschrsc.the_icon, verStr);
  343.   
  344.   mtUtils.SetObjcString (adr,     MausTauschrsc.newadr,"");
  345.   mtUtils.SetObjcString (gruppen, MausTauschrsc.newgroup,"");
  346.   mtUtils.SetObjcString (MausTauschrsc.TreeAddr^[MausTauschrsc.whichnr], MausTauschrsc.nrstring,"");
  347.   mtUtils.SetObjcString (MausTauschrsc.TreeAddr^[MausTauschrsc.datumein], MausTauschrsc.ddate,"");
  348.   mtUtils.SetObjcString (MausTauschrsc.TreeAddr^[MausTauschrsc.findbox], MausTauschrsc.ssuchstr,"");
  349.   mtUtils.SetObjcString (MausTauschrsc.TreeAddr^[MausTauschrsc.system],  MausTauschrsc.sysstr,"");
  350.   
  351.   IF mtAppl.Bitplanes < 4 
  352.   THEN
  353.     CatOpts.maxColors := 1;
  354.     FOR z := 1 TO CARDINAL(mtAppl.Bitplanes) DO
  355.       CatOpts.maxColors := CatOpts.maxColors * 2;
  356.     END;
  357.     bp := CatOpts.maxColors * 2;
  358.     FOR z := bp+1 TO 32 DO
  359.       mtUtils.ExclFlag (colPopup, z, MagicAES.SELECTABLE);
  360.       mtUtils.InclState (colPopup, z, MagicAES.DISABLED);
  361.     END;
  362.   ELSE
  363.     CatOpts.maxColors := 16;
  364.   END;
  365.  
  366.   RETURN TRUE;
  367. END InitRsc;
  368.  
  369. PROCEDURE DoAbout;
  370. VAR j : INTEGER;
  371. BEGIN
  372.   j := FormHandle(about);
  373.   IF j = MausTauschrsc.ainfo THEN 
  374.     CatHelp.DoHelp (CatHelp.catinfo);
  375.   END;
  376. END DoAbout;
  377.  
  378. PROCEDURE ClearScreen();
  379. BEGIN
  380.   MagicDOS.Cconout(33C); MagicDOS.Cconout('E');
  381. END ClearScreen;
  382.  
  383. PROCEDURE ClearBuffer(e : BITSET; force : BOOLEAN; ks: BITSET; sc: INTEGER; char: CHAR);
  384.   VAR kstate : BITSET;
  385.       scanCh : CHAR;
  386.       scan   : INTEGER;
  387.       ch     : CHAR;
  388.       kReturn: INTEGER;
  389. BEGIN
  390.   IF MagicAES.MUKEYBD IN e THEN
  391.     (* Parameter-Array fllen *)
  392.     MagicAES.AESIntIn[0] := INTEGER({MagicAES.MUKEYBD, MagicAES.MUTIMER});
  393.  
  394.     MagicAES.AESIntIn[14] := 0;   (* ev_mtlocount: 0 ms *)
  395.     MagicAES.AESIntIn[15] := 0;   (* ev_mthicount: 0 *)
  396.     
  397.     MagicAES.AESAddrIn[0] := ADR(mess);
  398.     
  399.     REPEAT
  400.       e := MagicAES.EvntPmulti ();
  401.       kstate := MagicSys.CastToBitset(MagicAES.AESIntOut[4]);
  402.       kReturn  := MagicAES.AESIntOut[5];
  403.       SplitWordToByte(kReturn, scanCh, ch);
  404.       scan := ORD (scanCh);
  405.     UNTIL ~(MagicAES.MUKEYBD IN e) (* OR ((CAP(char) IN CatTypes.charSet{'A'..'Z','0'..'9'}) & (sc < 54)) *)
  406.         OR (~force & ((ks#kstate) OR (scan # sc)));
  407.     IF MagicAES.MUKEYBD IN e
  408.     THEN
  409.       PushKey (kstate, CHR(scan), ch);
  410.     END;
  411.   END;
  412. END ClearBuffer;
  413.  
  414. PROCEDURE ProcessFilter (wdw: INTEGER; withDial: BOOLEAN);
  415.   VAR cmd       : CatTypes.String255;
  416. BEGIN
  417.   IF (withDial & CatOpts2.doFilter (filterNumber, cmd)) OR
  418.      (~withDial & CatOpts2.doPopupFilter (filterNumber, cmd))
  419.   THEN
  420.     IF filterNumber <= 7
  421.     THEN
  422.       CASE filterNumber OF
  423.         0   : CatEdit.BlockRot  (wdw); |
  424.         1   : CatEdit.BlockRot18 (wdw); |
  425.         2   : CatEdit.BlockSwap (wdw); |
  426.         3   : CatEdit.BlockUp   (wdw); |
  427.         4   : CatEdit.BlockDown (wdw); |
  428.         5   : CatEdit.BlockCapitals (wdw); |
  429.         6   : CatEdit.BlockMirror (wdw); |
  430.         7   : CatEdit.BlockDecode (wdw); |
  431.       ELSE
  432.       END;
  433.     ELSE
  434.       IF LENGTH(cmd) > 0
  435.       THEN
  436.         CatUtil.PipeEditBlock (wdw, cmd);
  437.       END;
  438.     END;
  439.   END;
  440. END ProcessFilter;
  441.  
  442. PROCEDURE DoShell();
  443. VAR shellCommand : CatTypes.String255;
  444.     j : INTEGER;
  445. BEGIN
  446.   mtUtils.SetObjcStringAdr(system, MausTauschrsc.systitle, CADR(sysStrOne));
  447.   mtUtils.ObjcString(system, MausTauschrsc.sysstr, shellCommand);
  448.   IF FormHandle(system) # MausTauschrsc.sysabruc THEN
  449.     mtUtils.ObjcString(system, MausTauschrsc.sysstr, shellCommand);
  450.     IF ~multiTask
  451.     THEN
  452.       mtAppl.MouseOff;
  453.       ClearScreen();
  454.       v.bool := data.WritePos();
  455.       MagicAES.WindUpdate(MagicAES.ENDUPDATE);
  456.     END;
  457.     ShellCall.CallShell (shellCommand, FALSE);
  458.     IF ~multiTask
  459.     THEN
  460.       MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  461.     END;
  462.     v.bool := data.ReadPos();
  463.     IF ~multiTask
  464.     THEN
  465.       MagicDOS.Cconws(CR+CR+'- Taste drcken -');
  466.       ClearBuffer({MagicAES.MUKEYBD}, TRUE, {}, 0, 0C);
  467.       MagicAES.EvntKeybd(v.int, v.int, v.char);
  468.       MagicDOS.Cconws(33C+'f'+0C);        (* Cursor ausschalten *)
  469.       mtAppl.MouseArrow;
  470.       MagicAES.FormDial(MagicAES.FMDFINISH, null, WdwManager.deskSize);
  471.       v.int := MagicAES.MenuBar(menu, MagicAES.Set);
  472.     END;
  473.   ELSE
  474.     mtUtils.SetObjcString(system, MausTauschrsc.sysstr, shellCommand);
  475.   END;
  476. END DoShell;
  477.  
  478. PROCEDURE ReadInfoDatei(doFsel: BOOLEAN; groupsDeleted: BOOLEAN);FORWARD;
  479.  
  480. PROCEDURE ButtonHandler(x,y: INTEGER; Button: BITSET; Clicks: INTEGER; kstate : BITSET; obj : INTEGER);
  481. CONST   wgStr   = 'Wegen:';
  482. VAR z : CARDINAL;
  483.     Gruppe  : CatTypes.String255;
  484.     Betreff : CatTypes.String255;
  485.     str     : CatTypes.String255;
  486.     ca      : CARDINAL;
  487.     c       : CHAR;
  488.     start   : CARDINAL;
  489.  
  490.   PROCEDURE Wiggle(obj : INTEGER; simple: BOOLEAN);
  491.   BEGIN
  492.     SetState(desk, obj, {MagicAES.SELECTED});
  493.     DrawButton(obj);
  494.     IF ~CatGlobal.tos3DLook & ~simple
  495.     THEN
  496.       MagicAES.EvntTimer(75);
  497.       SetState(desk, obj, {});
  498.       DrawButton(obj);
  499.       MagicAES.EvntTimer(75);
  500.       SetState(desk, obj, {MagicAES.SELECTED});
  501.       DrawButton(obj);
  502.     END;
  503.   END Wiggle;
  504.  
  505.   PROCEDURE Normal(obj : INTEGER);
  506.   BEGIN
  507.     SetState(desk, obj, {});
  508.     DrawButton(obj);
  509.   END Normal;
  510.  
  511.   PROCEDURE ChangeIt();
  512.   BEGIN
  513.     IF BMess THEN
  514.       Wiggle (MausTauschrsc.messages, FALSE);
  515.       SetState(desk, MausTauschrsc.stichwor, {});
  516.       SetState(desk, MausTauschrsc.messages, {MagicAES.SELECTED})
  517.     ELSE
  518.       Wiggle (MausTauschrsc.stichwor, FALSE);
  519.       SetState(desk, MausTauschrsc.messages, {});
  520.       SetState(desk, MausTauschrsc.stichwor, {MagicAES.SELECTED});
  521.     END;
  522.     DrawButton(MausTauschrsc.stichwor);
  523.     DrawButton(MausTauschrsc.messages);
  524.     CheckItem (menu, MausTauschrsc.treadmsg, ~BMess);
  525.   END ChangeIt;
  526.  
  527.   PROCEDURE HandlePers(item : INTEGER);
  528.   BEGIN
  529.     MagicStrings.Assign ('', str);
  530.     IF ListHelp.SelectName(str) THEN
  531.       IF grinTools.BetreffHolen (-1, Betreff, 'Stichwort fr neue pers”nliche Nachricht an:',
  532.                                  str, wgStr, FALSE) THEN
  533.         Normal(item);
  534.         NewPersMsg(str, "", Betreff);
  535.       ELSE
  536.         Normal(item);
  537.       END
  538.     ELSE
  539.       Normal(item);
  540.     END
  541.   END HandlePers;
  542.  
  543. (*TYPE getNumberProc = PROCEDURE ((* dataHandle *) ADDRESS):CARDINAL;*)
  544.   PROCEDURE getIdNumber(ptr : data.OneGroupHandle):CARDINAL;
  545.   BEGIN
  546.     RETURN data.NumberOfID(ptr, str);
  547.   END getIdNumber;
  548.  
  549.   PROCEDURE getDateNumber(ptr : data.OneGroupHandle):CARDINAL;
  550.   BEGIN
  551.     RETURN data.NumberOfDate(ptr, ConvertDate.StrToDate(str));
  552.   END getDateNumber;
  553.  
  554. VAR mode : grin.openMode;
  555.     sMode: ListHelp.groupSelectMode;
  556.  
  557. BEGIN
  558.   Betreff := "";
  559.   Gruppe  := "";
  560.   IF obj = -1 THEN
  561.     IF ClickIsInButton(x,y) THEN
  562.       obj := MagicAES.ObjcFind(desk, 0, 99, x, y)
  563.     ELSE
  564.       RETURN
  565.     END;
  566.   END;
  567.   CASE obj OF
  568.     MausTauschrsc.newmess   :
  569.       Wiggle(MausTauschrsc.newmess, FALSE);
  570.       (* HandlePublic *)
  571.       ListHelp.SetLastGroup (Gruppe);
  572.       IF ~ListHelp.SelectGroup(Gruppe, ca, TRUE, FALSE, FALSE, ListHelp.gsmWrite) THEN
  573.         Normal(MausTauschrsc.newmess);
  574.         RETURN
  575.       END;
  576.       IF ca # dataSys.private THEN
  577.         IF Gruppe[0] = "" THEN MagicStrings.Assign ('™ffentlich', Gruppe) END;
  578.         IF grinTools.BetreffHolen (-1, Betreff, 'Stichwort fr neue Mitteilung in Gruppe:',
  579.                                    Gruppe, wgStr, FALSE) THEN
  580.           Normal(MausTauschrsc.newmess);
  581.           NewMessage(Gruppe, Betreff);
  582.         ELSE
  583.           Normal(MausTauschrsc.newmess);
  584.         END
  585.         ELSE
  586.         HandlePers(MausTauschrsc.newmess)
  587.       END |
  588.     MausTauschrsc.newpers:
  589.       Wiggle(MausTauschrsc.newpers, FALSE);
  590.       HandlePers(MausTauschrsc.newpers) |
  591.     MausTauschrsc.readpos,
  592.     MausTauschrsc.readall,
  593.     MausTauschrsc.readnew,
  594.     MausTauschrsc.readnum,
  595.     MausTauschrsc.readdate,
  596.     MausTauschrsc.readunread:
  597.       Wiggle(obj, FALSE);
  598.       (* Lesemodus bestimmen *)
  599.       CASE obj OF
  600.         MausTauschrsc.readpos : sMode := ListHelp.gsmReadLastPos; |
  601.         MausTauschrsc.readall : sMode := ListHelp.gsmReadBegin;   |
  602.         MausTauschrsc.readnew : sMode := ListHelp.gsmReadNew;     |
  603.         MausTauschrsc.readnum : sMode := ListHelp.gsmReadId;      |
  604.         MausTauschrsc.readdate    : sMode := ListHelp.gsmReadDate; |
  605.         MausTauschrsc.readunread  : sMode := ListHelp.gsmReadUnread; |
  606.       ELSE
  607.         sMode := ListHelp.gsmOther;
  608.       END;
  609.   
  610.       IF ListHelp.SelectGroup(Gruppe, ca, FALSE, FALSE, FALSE, sMode) THEN
  611.         IF obj = MausTauschrsc.readnum THEN
  612.           IF CatOpts2.NrHolen(str) THEN 
  613.             IF BMess THEN
  614.               v.int := grin.grinOpenWithProc(ca, getIdNumber, grin.grinNextMess, 0, grin.mOther)
  615.             ELSE
  616.               msgList.listOpenWithProc (ca, getIdNumber, -1, grin.mOther);
  617.             END;
  618.           END;
  619.           Normal(obj); RETURN
  620.         ELSIF obj = MausTauschrsc.readdate THEN
  621.           IF CatOpts2.DatumHolen(FALSE, str) THEN
  622.             IF BMess
  623.             THEN
  624.               v.int := grin.grinOpenWithProc(ca, getDateNumber, grin.grinNextMess, 0, grin.mOther)
  625.             ELSE
  626.               msgList.listOpenWithProc (ca, getDateNumber, -1, grin.mOther);
  627.             END;
  628.           END;
  629.           Normal(obj); RETURN
  630.         END;
  631.         CASE obj OF
  632.           MausTauschrsc.readpos: 
  633.             start := data.lastReadMsgOfGroup(ca); 
  634.             mode := grin.mLastPos; |
  635.           MausTauschrsc.readall: 
  636.             start := 0; 
  637.             mode := grin.mFromBeginning; |
  638.           MausTauschrsc.readnew: 
  639.             start := data.FirstNewMsg(ca); 
  640.             mode := grin.mFirstNew; |
  641.           MausTauschrsc.readunread:
  642.             start := data.unreadMsgPos(ca);  
  643.             mode := grin.mUnread; |
  644.         ELSE
  645.         END;
  646.         Normal(obj);
  647.         IF BMess THEN
  648.           v.int := grin.grinOpenMessage(ca, start, grin.grinNextMess, 0, mode)
  649.         ELSE
  650.           msgList.listOpen (ca, start, -1, mode)
  651.         END;
  652.       ELSE
  653.         Normal(obj);
  654.       END; |
  655.     MausTauschrsc.stichwor,
  656.     MausTauschrsc.messages:
  657.       IF BMess # (obj = MausTauschrsc.messages)
  658.       THEN  
  659.         BMess := (obj = MausTauschrsc.messages); 
  660.         ChangeIt();
  661.         v.bool := ConfVars.SetConfigBool (cReadMess, BMess);
  662.       END |
  663.     MausTauschrsc.catinfna,
  664.     MausTauschrsc.catinfn0,
  665.     MausTauschrsc.catinfn1:
  666.       obj := MausTauschrsc.catinfna;
  667.       Wiggle (obj, TRUE);
  668.       ReadInfoDatei (TRUE, FALSE);
  669.       Normal (obj); |
  670.   ELSE
  671.   END;
  672. END ButtonHandler;
  673.  
  674. VAR lbox: ADDRESS;
  675.     lbsr,
  676.     lbr : mtUtils.tRect;
  677.     
  678. PROCEDURE InitLoadingBox (REF s: ARRAY OF CHAR): BOOLEAN;
  679. BEGIN
  680.   lbox := MausTauschrsc.TreeAddr^[MausTauschrsc.loadbox];
  681.   mtUtils.SetObjcString (lbox, MausTauschrsc.lver, CatTypes.CatVersion);
  682.   MagicAES.FormCenter (lbox, lbr);
  683.   lbsr := mtUtils.tRect {0,0,10,10};
  684.   MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  685.   MagicAES.FormDial (MagicAES.FMDSTART, lbsr, lbr);
  686.   MagicAES.FormDial (MagicAES.FMDGROW, lbsr, lbr);
  687.   mtUtils.SetObjcString (lbox, MausTauschrsc.inittext, s);
  688.   MagicAES.ObjcDraw (lbox, 0, 8, lbr);
  689.   RETURN TRUE;
  690. END InitLoadingBox;
  691.  
  692. PROCEDURE TellLoadingBox (REF s: ARRAY OF CHAR): BOOLEAN;
  693.   VAR r : mtUtils.tRect;
  694. BEGIN
  695.   mtUtils.SetObjcString (lbox, MausTauschrsc.inittext, s);
  696.   mtUtils.CalcArea (lbox, MausTauschrsc.inittext, r);
  697.   MagicAES.ObjcDraw (lbox, 0, 8, r);
  698.   RETURN TRUE;
  699. END TellLoadingBox;
  700.  
  701. PROCEDURE FreeLoadingBox ();
  702. BEGIN
  703.   MagicAES.FormDial (MagicAES.FMDSHRINK, lbsr, lbr);
  704.   MagicAES.FormDial (MagicAES.FMDFINISH, lbsr, lbr);
  705.   MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  706. END FreeLoadingBox;
  707.  
  708. PROCEDURE ReadInfoDatei(doFsel: BOOLEAN; groupsDeleted: BOOLEAN);
  709. VAR z : CARDINAL; scrap : ARRAY[0..15] OF CHAR;
  710.     ap : ARRAY[0..1] OF CHAR;
  711.     str: CatTypes.String255;
  712.     cfgFile : CatTypes.String255;
  713. BEGIN
  714.   mtDir.SplitPath (CatGlobal.infName, str, str, scrap);
  715.   IF scrap[0] # ''
  716.   THEN
  717.     ap := '*.';
  718.     MagicStrings.Insert(ap, scrap, 0);
  719.   ELSE
  720.     scrap := '*.inf'
  721.   END;
  722.  
  723.   IF ~doFsel OR CatGlobal.FselGet(CatGlobal.infPath, CatGlobal.infName, scrap, 'Infodatei laden', FALSE) THEN
  724.     CloseButton(FALSE);
  725.     grin.grinCloseAll();
  726.     msgList.listCloseAll();
  727.     msgList.listFreeAll();
  728.     treeList.treeCloseAll();
  729.     IF ~WdwManager.CloseAllWindows (FALSE) THEN RETURN END;
  730.     v.bool := data.WritePos();       (* Positionstabelle zurckschreiben *)
  731.     IF ~groupsDeleted
  732.     THEN
  733.       v.bool := GroupSelect.SaveChangedGroupList (); (* Gruppenliste zurckschreiben, falls ge„ndert *)
  734.     END;
  735.     v.bool := InitLoadingBox(cInitInf);
  736.     IF ReadInf(CatGlobal.infPath, CatGlobal.infName, TRUE, TRUE) THEN
  737.       (* Hier auch noch die Namenslisten und Gruppenlisten freigeben! *)
  738.       ConfVars.DeleteAllVars();
  739.       ConfVars.CloseConfig();
  740.       v.bool := TellLoadingBox (cInitConfig);
  741.       ReadUserBlock();
  742.       CatGlobal.SetColors();
  743.       v.bool := TellLoadingBox (cInitGrin);
  744.       v.bool := grin.grinInit();
  745.       v.bool := TellLoadingBox (cInitGroups);
  746.       v.bool := GroupSelect.ReadGroupList(); (* Muž eigentlich beachtet werden! *)
  747.       v.bool := WiederVorlage.ReadResubList();
  748.       v.bool := TellLoadingBox (cInitData);
  749.       v.bool := data.InitDataBase();
  750.       IF ConfVars.GetConfigString (cPrtCfg, cfgFile)
  751.       THEN
  752.         v.bool := TellLoadingBox (cInitPrint);
  753.         Printer.LoadCFGFile (cfgFile);
  754.       END;
  755.       v.bool := TellLoadingBox (cInitMsgMan);
  756.       MsgWindow.InitMessageManager();
  757.       ConfVars.GetConfDefBool (cReadMess, BMess, TRUE);
  758.       mtUtils.SetState(desk, MausTauschrsc.stichwor, MagicAES.SELECTED, ~BMess);
  759.       mtUtils.SetState(desk, MausTauschrsc.messages, MagicAES.SELECTED, BMess);
  760.       CheckItem (menu, MausTauschrsc.treadmsg, ~BMess);
  761.       ButtonWindowOpen := DisplayButton(TRUE);
  762.       v.bool := TellLoadingBox (cInitInfos);
  763.       LoadInfoInf(TRUE, FALSE);
  764.       v.bool := TellLoadingBox (cInitList);
  765.       IF ConfVars.GetConfigBool(cSortNames,v.bool) & v.bool
  766.       THEN
  767.         v.bool := TellLoadingBox (cInitNames);
  768.         data.SortList (data.names);
  769.       END;
  770.       ConfVars.GetConfDefStr (cPrivateLine, str, CatTypes.cPrivateDefault);
  771.       msgList.SetListLine(str, TRUE);
  772.       ConfVars.GetConfDefStr (cGlobalLine, str, CatTypes.cGlobalDefault);
  773.       msgList.SetListLine(str, FALSE);
  774.       ConfVars.GetConfDefBool (cHiddenFeatures, mayUseHidden, FALSE);
  775.       WiederVorlage.CheckForResub ();
  776.     END;
  777.     FreeLoadingBox ();
  778.   END;
  779.   mtAppl.MouseBusy();
  780.   mtAppl.MouseArrow();
  781. END ReadInfoDatei;
  782.  
  783.  
  784. PROCEDURE StartPrg(REF Path : ARRAY OF CHAR; Name, cmd : ARRAY OF CHAR; BWin :BOOLEAN;
  785.                    doParallel: BOOLEAN):INTEGER;
  786. VAR res  : INTEGER;
  787.     ptail: CatTypes.String255;
  788.     ap   : ARRAY[0..1] OF CHAR;
  789.     prev : INTEGER;
  790.     w   : RECORD handle,d1,d2,d3 : INTEGER END;
  791.  
  792.   PROCEDURE isAppl():BOOLEAN;
  793.   BEGIN
  794.     RETURN TRUE;
  795.   END isAppl;
  796.  
  797.   PROCEDURE KillWinds();
  798.   BEGIN
  799.     prev := 0;
  800.     LOOP
  801.       MagicAES.WindGet(0, MagicAES.WFTOP, w);
  802.       (* Ende, wenn das Desktop-Fenster erreicht wurde oder *)
  803.       (* wenn ein Fenster nicht geschlossen werden konnte   *)
  804.       IF (w.handle = 0) OR (w.handle = prev) THEN EXIT END;
  805.       MagicAES.WindClose(w.handle);
  806.       MagicAES.WindDelete(w.handle);
  807.       IF WdwManager.IsInQueue (w.handle)
  808.       THEN
  809.         WdwManager.WindowIsClosed (w.handle);
  810.       END;
  811.       prev := w.handle;
  812.     END;
  813.     ConfVars.GetConfDefBool (cClearBackground, v.bool, TRUE);
  814.     IF minTos14 & v.bool THEN
  815.       MagicAES.WindNew(); (* wind_update ist schon *)
  816.       MagicAES.WindUpdate(MagicAES.BEGUPDATE);  (* WindUpdate kurz wieder anschalten *)
  817.     END
  818.   END KillWinds;
  819.  
  820. BEGIN
  821.   IF ~multiTask OR
  822.      multiGEM OR
  823.      ~doParallel
  824.   THEN
  825.     
  826.     (* Alle eigenen Fenster schliežen *)
  827.     IF ~CatUtil.WriteSavePos(FALSE, TRUE) THEN RETURN 0 END;
  828.     
  829.     IF BWin THEN
  830.       CloseButton(FALSE)
  831.     END;
  832.     
  833.     (* Watchdog Bescheid geben *)
  834.     SendTerminate(FALSE);
  835.     
  836.     v.int := MagicAES.MenuBar(menu, MagicAES.Reset);
  837.   
  838.     (* L„nge der Kommandozeile in Byte Nummer 0 *)
  839.     IF cmd[0] # ''
  840.     THEN
  841.       ap := ' ';
  842.       MagicStrings.Insert(ap, cmd, 0);
  843.       cmd[0] := CHR(MagicStrings.Length(cmd));
  844.     END;
  845.  
  846.     v.bool := SetPath(Path);
  847.   
  848.     MagicStrings.Assign(Path, ptail);
  849.     MagicStrings.Append(Name, ptail);
  850.     IF minTos14 & ~neoDeskBugFix & ~multiTOS
  851.     THEN
  852.       (* Shellwrite ausfhren *)
  853.       chPid := MagicAES.ShelWrite(1,1,1, ptail, cmd); (* Richtig! Etwas merkwrdige Bezeichnung *)
  854.     END;
  855.     IF MagicAES.AESGlobal.apCount = 1 THEN (* kein MultiTOS/MultiGEM *)
  856.       (* hier demn„chst noch die Menzeile ersetzen *)
  857.       MagicAES.ApplExit(); (* AC_CLOSE an ACCs senden *)
  858.       mtAppl.ApplIdent := MagicAES.ApplInit();
  859.       (* Eigentlich soll man darauf nur lesend zugreifen, aber diese Ausnahme ist wohl erlaubt *)
  860.       KillWinds();
  861.     END;
  862.   
  863.     MagicAES.ApplExit();
  864.   
  865.     IF SetPath(Path) THEN
  866.       (* Zur Sicherheit die Positionstabelle speichern *)
  867.       v.bool := data.WritePos();
  868.       v.bool := GroupSelect.SaveChangedGroupList (); (* Gruppenliste zurckschreiben, falls ge„ndert *)
  869.       ap[0] := 0C; (* Leeres Environment, MagicDOS setzt dann einen Nullpointer ein *)
  870.       MagicAES.WindUpdate(MagicAES.ENDUPDATE);
  871.       res := MagicDOS.Pexec(MagicDOS.LoadnGo, Name, cmd, ap);
  872.       MagicAES.WindUpdate(MagicAES.BEGUPDATE);
  873.       IF MagicAES.AESGlobal.apCount = 1 THEN KillWinds(); END;
  874.       v.bool := data.ReadPos();
  875.       mtAppl.MouseArrow;
  876.     END;
  877.   
  878.     mtAppl.ApplIdent := MagicAES.ApplInit();
  879.   
  880.     MagicAES.FormDial(MagicAES.FMDFINISH, null, WdwManager.deskSize);
  881.     IF BWin & ButtonWindowOpen THEN
  882.       ButtonWindowOpen := DisplayButton(FALSE);
  883.     ELSE
  884.       ButtonWindowOpen := FALSE;
  885.     END;
  886.     
  887.     (* tempor„ren Pfad holen bevor Konfigbereich gewechselt wird! *)
  888.     CatUtil.GetPosPath (ptail);
  889.     Strings.Append (CatUtil.tmpInf, ptail, v.bool);
  890.     (* Konfigbereich wechseln *)
  891.     ConfVars.ConfigConfigModule (TRUE);
  892.     IF ConfVars.ReadConfigFile (ptail)
  893.     THEN
  894.       (* Alles wieder restaurieren *)
  895.       MsgWindow.msgRestorePos();
  896.       grin.grinRestorePos();
  897.       msgList.listRestorePos();
  898.       CatEdit.EditRestorePos();
  899.       CatGlobal.ApplPath (ptail);
  900.       v.bool := DeleteFile (ptail, CatUtil.tmpInf);
  901.     END;
  902.     (* Variablen wieder l”schen *)
  903.     ConfVars.DeleteAllVars();
  904.     (* Und wieder auf normale Einstellung *)
  905.     ConfVars.ConfigConfigModule (FALSE);
  906.     CatGlobal.SetColors();
  907.     
  908.     WdwManager.HandlePendingEvents();
  909.     
  910.     v.int := MagicAES.MenuBar(menu, MagicAES.Set);
  911.     mtAppl.MouseArrow();
  912.   ELSE
  913.     (* Mag!X oder MultiTOS *)
  914.     (* L„nge der Kommandozeile in Byte Nummer 0 *)
  915.     ap := ' ';
  916.     MagicStrings.Insert(ap, cmd, 0);
  917.     cmd[0] := CHR(MagicStrings.Length(cmd));
  918.  
  919.     IF SetPath(Path) THEN END;
  920.   
  921.     MagicStrings.Assign(Path, ptail);
  922.     MagicStrings.Append(Name, ptail);
  923.     MagicAES.WindUpdate(MagicAES.ENDUPDATE);
  924.     IF multiTOS & ~magIx
  925.     THEN
  926.       (* AES >= 4.0, parallel starten *)
  927.       chPid := MagicAES.ShelWrite(0,1,1, ptail, cmd); 
  928.     ELSE
  929.       (* Mag!X, parallel starten *)
  930.       chPid := MagicAES.ShelWrite(1,1,100, ptail, cmd); 
  931.     END;
  932.     IF chPid = 0 THEN res := -1 ELSE res := 0 END;
  933.     MagicAES.WindUpdate(MagicAES.BEGUPDATE);
  934.   END;
  935.   RETURN res
  936. END StartPrg;
  937.  
  938. PROCEDURE StartIt();
  939. CONST loadInfAlt = '[2][CAT:|Aktuelle Info laden?][[Ja|:[Nein]';
  940. VAR i : INTEGER;
  941.     startStr : CatTypes.pathStrType;
  942.     scrapStr : CatTypes.nameStrType;
  943. BEGIN
  944.   IF CatGlobal.FselGet(CatGlobal.prgPath, CatGlobal.prgName, '*.prg', 'Programm starten', FALSE) THEN
  945.   
  946.     startStr := '';
  947.     
  948.     i := StartPrg(CatGlobal.prgPath, CatGlobal.prgName, startStr, TRUE, TRUE);
  949.     IF (i = 04711H) &
  950.        (mtAlerts.Alert(1, loadInfAlt) = 1) OR
  951.        (i = 04712H) THEN
  952.       ReadInfoDatei(TRUE, FALSE);
  953.     ELSIF (i = 04713H) THEN
  954.       (* Return from CatPutz *)
  955.       ReadInfoDatei (FALSE, TRUE);
  956.     ELSIF (i # 0)
  957.     THEN
  958.       ErrorAlert (i);
  959.     END;
  960.   END;
  961. END StartIt;
  962.  
  963. PROCEDURE CallInfo();
  964. VAR res : INTEGER;
  965.     ext : ARRAY [0..12] OF CHAR;
  966.     path,
  967.     name,
  968.     callStr : ARRAY[0..255] OF CHAR;
  969.  
  970. BEGIN
  971.   IF doInfoList (TRUE, callStr)
  972.   THEN
  973.     mtDir.SplitPath (callStr, path, name, ext);
  974.     OpenEditWindow (path, name, FALSE, UserBLK.infoRO);
  975.   END;
  976. END CallInfo;
  977.  
  978. PROCEDURE CreateInfile(): BOOLEAN;
  979. BEGIN
  980.   Messages.MsgAskForSave();
  981.   IF MakeInFile()
  982.   THEN
  983.     Messages.ReloadEditors();
  984.     RETURN TRUE;
  985.   END;
  986.   RETURN FALSE;
  987. END CreateInfile;
  988.  
  989. PROCEDURE DecodeOutfile();
  990.   VAR val : BOOLEAN;
  991.       logName : ARRAY [0..14] OF CHAR;
  992. BEGIN
  993.   grin.grinCloseAll();
  994.   msgList.listCloseAll();
  995.   treeList.treeCloseAll();
  996.   msgList.listFreeAll();
  997.   IF Parser.OutfileEinsortieren() (* ConvertOutfile() *) THEN
  998.     v.bool :=GroupSelect.SaveChangedGroupList();
  999.     IF ~batchProcess & UserBLK.MakeAfterDecode THEN 
  1000.       v.bool := CreateInfile() 
  1001.     END;
  1002.     IF ConfVars.GetConfigBool (cShowLog, val)
  1003.        & val
  1004.        & ~batchProcess
  1005.     THEN
  1006.       logName := 'LOG.txt';
  1007.       OpenEditWindow (DataPath, logName, FALSE, UserBLK.infoRO);
  1008.     END;
  1009.   END;
  1010. END DecodeOutfile;
  1011.  
  1012. PROCEDURE StartTerminal(inBatch: BOOLEAN);
  1013.   VAR res : INTEGER;
  1014. BEGIN
  1015.   IF ~batchProcess & UserBLK.MakeBeforeTerminal THEN 
  1016.     IF ~CreateInfile() THEN RETURN END;
  1017.   END;
  1018.   IF UserBLK.TermAsOverlay
  1019.   THEN
  1020.     IF saveAllPositions
  1021.     THEN
  1022.       EndOfPrg := CatUtil.WriteSavePos (FALSE, FALSE)
  1023.     ELSE
  1024.       grin.grinCloseAll();      (* Die grin-Fenster mssen unbedingt vor denen 
  1025.                                  * von msgList geschlossen werden
  1026.                                  *)
  1027.       msgList.listCloseAll();
  1028.       treeList.treeCloseAll();
  1029.       msgList.listFreeAll();
  1030.       CloseButton (TRUE);
  1031.       EndOfPrg := WdwManager.CloseAllWindows (FALSE);
  1032.     END;
  1033.     IF ~EndOfPrg THEN RETURN END;
  1034.     startTerm := TRUE;
  1035.     RETURN
  1036.   END;
  1037.   res := StartPrg (TerminalPath, TerminalName, TerminalCmd, TRUE, ~inBatch);
  1038.   IF res < 0 THEN ErrorAlert (res); END;
  1039.   termPid := chPid;
  1040.   IF (res = 0) & (multiTOS OR magIx)
  1041.   THEN
  1042.     termStarted := ~inBatch;
  1043.   ELSE
  1044.     termStarted := FALSE;
  1045.   END;
  1046.   IF ~batchProcess & 
  1047.     (~(multiTOS OR magIx) OR inBatch) &
  1048.      (res = 0)
  1049.   THEN
  1050.     (* Bei MultiTOS auf Event CHEXIT warten *)
  1051.     IF UserBLK.DecodeAfterRun THEN DecodeOutfile() END;
  1052.   END;
  1053. END StartTerminal;
  1054.  
  1055. PROCEDURE QuoteBlock (wdw : INTEGER; withShift: BOOLEAN); 
  1056.  
  1057.   PROCEDURE GetInitials(botWdw : INTEGER; VAR str : ARRAY OF CHAR);
  1058.   VAR z, zz, l : CARDINAL;
  1059.       from     : ARRAY [0..255] OF CHAR;
  1060.   
  1061.   PROCEDURE putChar();
  1062.   BEGIN
  1063.     IF (zz <= l) & ~(from[zz] IN CatTypes.charSet{' ','@','"',"'",'(',')'}) & (z < HIGH (str)) THEN
  1064.       str[z] := CAP(from[zz]);
  1065.       INC(z);
  1066.     END;
  1067.   END putChar;
  1068.   
  1069.   BEGIN
  1070.     z := 0;
  1071.     IF UserBLK.initialQuote THEN
  1072.       grin.ActualName (botWdw, from);
  1073.       l := MagicStrings.Length(from);
  1074.       IF l > 0 THEN
  1075.         zz := 0;
  1076.         DEC(l);
  1077.         REPEAT
  1078.         
  1079.           (* Immer noch nicht sch”n, aber besser als vorher *)
  1080.           WHILE (zz <= l) & (from[zz] IN CatTypes.charSet{' ','_','-','"','(',')'}) DO INC(zz) END;
  1081.           IF (zz = 0) OR ((zz > 0) & ~(from[zz-1] IN CatTypes.charSet{"<",'"',"'","("}))
  1082.           THEN
  1083.             putChar();
  1084.           END;
  1085.           WHILE (zz <= l) & ~(from[zz] IN CatTypes.charSet{' ','_','-','@'}) DO INC(zz) END;
  1086.         UNTIL (zz>=l) OR (from[zz] = '@') OR (z>= HIGH(str));
  1087.       END;
  1088.     END;
  1089.     str[z] := '>';
  1090.     str[z+1] := 0C;
  1091.   END GetInitials;
  1092.   
  1093.   VAR botWdw : INTEGER;
  1094.       buf    : ADDRESS;
  1095.       bufLen : LONGCARD;
  1096.       pre    : ARRAY [0..7] OF CHAR;
  1097. BEGIN
  1098.   (* Erstmal falsche Fenster abfangen *)
  1099.   IF grin.grinWindowTop (wdw) OR ~CatEdit.IsEditTop (wdw) THEN RETURN END;
  1100.  
  1101.   (* Kein zweites Fenster offen? *)
  1102.   IF ~WdwManager.GetSecondWdw (botWdw) THEN RETURN END;
  1103.  
  1104.   (* Das untere Fenster ist kein MessageWindow? Geht nicht! *)
  1105.   IF ~grin.grinWindowTop (botWdw) THEN 
  1106.  
  1107.     (* Prfen, ob nur ein MessageWindow offen ist *)
  1108.     IF ~grin.grinOnlyOneWind (botWdw)
  1109.     THEN
  1110.       RETURN 
  1111.     END;
  1112.   END;
  1113.   (* Kein Block markiert? Zurck! *)
  1114.   IF ~CatEdit.BlockIsMarked (botWdw) THEN RETURN END;
  1115.   IF ~CatEdit.GetBlock (botWdw, FALSE, withShift, buf, bufLen) THEN RETURN END;
  1116.   (* Jetzt noch Initialien holen *)
  1117.   GetInitials (botWdw, pre);
  1118.   (* Test, ob Block zu grož *)
  1119.   IF bufLen >= MAX(CARDINAL)
  1120.   THEN
  1121.     MTE.info (MTE.longQuote);
  1122.     DEALLOCATE (buf, 0);
  1123.   ELSE
  1124.     (* Und jetzt Block einsetzen *)
  1125.     v.bool := CatEdit.QuoteSomething (wdw, pre, buf, SHORT(bufLen), 75);
  1126.   END;
  1127.   DEALLOCATE (buf, 0);
  1128. END QuoteBlock;
  1129.  
  1130. PROCEDURE ExternalPrint (wdw: INTEGER): BOOLEAN;
  1131.   VAR path, name: CatTypes.String255;
  1132.       printed: BOOLEAN;
  1133.       cmdLine,
  1134.       ideaParm,
  1135.       ideaPath,
  1136.       ideaName : CatTypes.String255;
  1137. BEGIN
  1138.   (* tempor„re Datei erstellen *)
  1139.   CatUtil.makeTmpName (path, name);
  1140.   (* Text in Datei schreiben *)
  1141.   CatEdit.EditSave(wdw, path, name, FALSE);
  1142.   (* Jetzt externes Druckprogramm aufrufen *)
  1143.   printed := SendPrintFile (path, name, CatEdit.GetMode (wdw, CatEdit.effMode));
  1144.  
  1145.   (* Wenn nicht ber Protokoll gedruckt, dann Idealist starten 
  1146.    * mit Kommandozeile 
  1147.    *)
  1148.   IF ~printed
  1149.   THEN
  1150.     IF ConfVars.GetConfigString (cIdealist, ideaPath)
  1151.     THEN
  1152.       FileNames.SplitPath (ideaPath, ideaPath, ideaName);
  1153.       MagicStrings.Assign ("-BDE", cmdLine);
  1154.       IF CatEdit.GetMode (wdw, CatEdit.effMode)
  1155.       THEN
  1156.         MagicStrings.Append ("+", cmdLine);
  1157.       ELSE
  1158.         MagicStrings.Append ("-", cmdLine);
  1159.       END;
  1160.       IF ConfVars.GetConfigString (cIdealistParm, ideaParm)
  1161.       THEN
  1162.         MagicStrings.Append (" ", cmdLine);
  1163.         MagicStrings.Append (ideaParm, cmdLine);
  1164.       END;
  1165.       MagicStrings.Append (" ", cmdLine);
  1166.       MagicStrings.Append (path, cmdLine);
  1167.       MagicStrings.Append (name, cmdLine);
  1168.       printed := StartPrg (ideaPath, ideaName, cmdLine, TRUE, TRUE) >= 0;
  1169.     END;
  1170.   END;
  1171.   IF ~printed
  1172.   THEN
  1173.     (* tempor„re Datei wieder l”schen *)
  1174.     v.bool := CatFiles.DeleteFile (path, name);
  1175.   END;
  1176.   RETURN printed;
  1177. END ExternalPrint;
  1178.  
  1179. PROCEDURE doHelp (wdw : INTEGER; kstate : BITSET);
  1180. VAR buf    : POINTER TO ARRAY [0..$7FFF] OF CHAR;
  1181.     bufLen : LONGCARD;
  1182.     str    : CatTypes.String127;
  1183.     txt    : CatTypes.String127;
  1184. BEGIN
  1185.   IF CatGlobal.WithShift (kstate)
  1186.   THEN
  1187.     str := 'CAT - Das MausTausch-FrontEnd';
  1188.     txt := 'cat.hyp';
  1189.     IF ~mouse THEN
  1190.       mtAppl.MouseOn; mouse := TRUE;
  1191.     END;
  1192.     IF CatEdit.IsEditTop (wdw) & CatEdit.BlockIsMarked (wdw) 
  1193.     THEN
  1194.       IF CatEdit.GetBlock (wdw, FALSE, FALSE, buf, bufLen) THEN 
  1195.         SendHelp (buf^);
  1196.         DEALLOCATE (buf, 0);
  1197.       ELSE
  1198.         v.bool := SendExtendedHelp (str, txt);
  1199.       END;
  1200.     ELSE
  1201.       v.bool := SendExtendedHelp (str, txt);
  1202.     END;
  1203.     dontSwitchOffMouse := TRUE;
  1204.   ELSE
  1205.     IF grin.grinWindowTop (wdw)
  1206.     THEN
  1207.       CatHelp.DoHelp (CatHelp.grin);
  1208.     ELSIF CatEdit.IsEditTop (wdw) 
  1209.     THEN
  1210.       CatHelp.DoHelp (CatHelp.editor);
  1211.     ELSIF MsgWindow.msgWindowTop (wdw) 
  1212.     THEN
  1213.       CatHelp.DoHelp (CatHelp.manager);
  1214.     ELSIF msgList.listWindowTop (wdw)
  1215.     THEN
  1216.       CatHelp.DoHelp (CatHelp.msglist);
  1217.     ELSIF treeList.treeWindowTop (wdw)
  1218.     THEN
  1219.       CatHelp.DoHelp (CatHelp.treelist);
  1220.     ELSE
  1221.       CatHelp.DoHelp (CatHelp.general);
  1222.     END;
  1223.   END;
  1224. END doHelp;
  1225.  
  1226. PROCEDURE WriteInfoline (wdw : INTEGER; kstate: BITSET);
  1227.   VAR botWdw : INTEGER;
  1228. BEGIN
  1229.   (* Erstmal falsche Fenster abfangen *)
  1230.   IF grin.grinWindowTop (wdw) OR ~CatEdit.IsEditTop (wdw) THEN RETURN END;
  1231.   (* Kein zweites Fenster offen? *)
  1232.   IF ~WdwManager.GetSecondWdw (botWdw) THEN RETURN END;
  1233.   (* Das untere Fenster ist kein MessageWindow? Geht nicht! *)
  1234.   IF ~grin.grinWindowTop (botWdw) THEN 
  1235.     (* Prfen, ob nur ein MessageWindow offen ist *)
  1236.     IF ~grin.grinOnlyOneWind (botWdw)
  1237.     THEN
  1238.       RETURN 
  1239.     END;
  1240.   END;
  1241.   (* Erstmal noch Infozeile berprfen *)
  1242.   IF CatGlobal.WithShift (kstate) 
  1243.   THEN
  1244.     IF ~CatOpts.CheckInfoline(UserBLK.infoline2) THEN RETURN END;
  1245.     (* Und jetzt Zeile basteln und in Editor *)
  1246.     grin.grinInfoline (botWdw, wdw, UserBLK.infoline2);
  1247.   ELSE
  1248.     IF ~CatOpts.CheckInfoline(UserBLK.infoline1) THEN RETURN END;
  1249.     (* Und jetzt Zeile basteln und in Editor *)
  1250.     grin.grinInfoline (botWdw, wdw, UserBLK.infoline1);
  1251.   END;
  1252. END WriteInfoline;
  1253.  
  1254. VAR InPath : CatTypes.pathStrType;
  1255.     InSel  : CatTypes.nameStrType;
  1256.     
  1257.     openPath : CatTypes.pathStrType;
  1258.     openSel  : CatTypes.nameStrType;
  1259.  
  1260. PROCEDURE MenuMessageHandler(item, title : CARDINAL; kstate : BITSET);
  1261. CONST quitAlt = '[2][CAT:|CAT wirklich beenden?][[Ja|:[Nein]';
  1262.       makeInAlt = '[2][CAT:|Infile erstellen?][[Ja|:[Nein]';
  1263.       insOutAlt = '[2][CAT:|Outfile einfgen?][[Ja|:[Nein]';
  1264.       saveCnfAlt = '[2][CAT:|Konfiguration|speichern?][[Ja|:[Nein]';
  1265.       
  1266. VAR res    : INTEGER;
  1267.     z, z2  : CARDINAL;
  1268.     message: ARRAY[0..40] OF CHAR;
  1269.     wild   : ARRAY[0..6] OF CHAR;
  1270.     fInfo  : FontSelect.tFontinfo;
  1271.     hdl    : INTEGER;
  1272.     font,
  1273.     size   : INTEGER;
  1274.     actSet : DialActionSet;
  1275.     ownTopWdw: INTEGER;
  1276.  
  1277.   PROCEDURE handleFSelMessage (item : CARDINAL);
  1278.   BEGIN
  1279.     wild := allWild;
  1280.     IF item = MausTauschrsc.editfile THEN message := 'Datei laden'; 
  1281.     ELSIF item = MausTauschrsc.tmerge THEN message := 'Datei hinzuladen'; 
  1282.     END;
  1283.  
  1284.     IF CatGlobal.FselGet(openPath, openSel, wild, message, FALSE) THEN
  1285.       IF (item = MausTauschrsc.editmess)
  1286.       OR (item = MausTauschrsc.editfile) 
  1287.       THEN
  1288.         OpenEditWindow(openPath, openSel, FALSE, FALSE);
  1289.       ELSIF item = MausTauschrsc.tmerge THEN
  1290.         CatEdit.EditMerge(ownTopWdw, openPath, openSel);
  1291.       END
  1292.     END
  1293.   END handleFSelMessage;
  1294.  
  1295. BEGIN
  1296.   IF ~ mouse THEN mtAppl.MouseOn; mouse := TRUE; END;
  1297.     WdwManager.GetOwnTopWindow (ownTopWdw);
  1298.     CASE item OF
  1299.       MausTauschrsc.tabout : DoAbout() |
  1300.       (* Datei-Menu *)
  1301.       MausTauschrsc.editfile,
  1302.       MausTauschrsc.tmerge  : handleFSelMessage (item) |
  1303.       MausTauschrsc.editmess: MsgWindow.msgOpen(TRUE); |
  1304.       MausTauschrsc.tclose  : IF ~WdwManager.WindowIsIcon (WdwManager.theTopWindow)
  1305.                               THEN
  1306.                                 v.bool := WdwManager.CloseWindow (WdwManager.theTopWindow, FALSE);
  1307.                               END; |
  1308.       MausTauschrsc.tsave   : IF CatEdit.IsEditTop(ownTopWdw) THEN
  1309.                                 CatEdit.EditSave(ownTopWdw, '', '', FALSE)
  1310.                               END; |
  1311.       MausTauschrsc.saveas  : IF msgList.listWindowTop (ownTopWdw)
  1312.                               THEN
  1313.                                 msgList.listSaveAs (ownTopWdw);
  1314.                               ELSE
  1315.                                 IF CatEdit.IsEditTop (ownTopWdw) &
  1316.                                    CatEdit.BlockIsMarked (ownTopWdw)
  1317.                                 THEN
  1318.                                   MagicStrings.Assign ('Block sichern als', message);
  1319.                                 ELSE
  1320.                                   MagicStrings.Assign ('Sichern als', message);
  1321.                                 END;
  1322.                                 IF CatGlobal.FselGet(CatGlobal.SavePath, CatGlobal.SaveName, allWild, message, FALSE) THEN
  1323.                                   IF CatEdit.IsEditTop(ownTopWdw) THEN
  1324.                                     CatEdit.EditSave(ownTopWdw, CatGlobal.SavePath, CatGlobal.SaveName, TRUE)
  1325.                                   END;
  1326.                                 END;
  1327.                               END; |
  1328.       MausTauschrsc.tprint  : IF CatEdit.IsEditTop(ownTopWdw) THEN
  1329.                                 IF ConfVars.GetConfigBool (cExternalPrint, v.bool) & v.bool
  1330.                                 THEN
  1331.                                   IF ~ExternalPrint (ownTopWdw)
  1332.                                   THEN
  1333.                                     CatEdit.EditPrint (ownTopWdw, CatEdit.BlockIsMarked (ownTopWdw));
  1334.                                   END;
  1335.                                 ELSE
  1336.                                   CatEdit.EditPrint (ownTopWdw, CatEdit.BlockIsMarked (ownTopWdw));
  1337.                                 END;
  1338.                               END |
  1339.       MausTauschrsc.mstartit: StartIt() |
  1340.       MausTauschrsc.callshel: DoShell() |
  1341.       MausTauschrsc.mausinfo: CallInfo() |
  1342.       MausTauschrsc.loadinf : ReadInfoDatei(TRUE, FALSE) |
  1343.       MausTauschrsc.tquit   : IF UserBLK.security & (mtAlerts.Alert(1, quitAlt) = 1) OR
  1344.                                 ~UserBLK.security
  1345.                               THEN
  1346.                                  IF saveAllPositions
  1347.                                  THEN
  1348.                                    EndOfPrg := CatUtil.WriteSavePos (FALSE, TRUE);
  1349.                                  ELSE
  1350.                                    grin.grinCloseAll();
  1351.                                    msgList.listCloseAll();
  1352.                                    treeList.treeCloseAll();
  1353.                                    msgList.listFreeAll();
  1354.                                    CloseButton (TRUE);
  1355.                                    EndOfPrg := WdwManager.CloseAllWindows (FALSE);
  1356.                                  END;
  1357.                                  IF EndOfPrg THEN RETURN END;
  1358.                               END; |
  1359.  
  1360.       (* Bearbeiten-Menu *)
  1361.       MausTauschrsc.tundo   : IF CatEdit.IsEditTop (ownTopWdw)
  1362.                               THEN 
  1363.                                 CatEdit.DoUndo (ownTopWdw); 
  1364.                               END; |
  1365.       MausTauschrsc.tcut    : IF ~CatGlobal.WithShift (kstate) THEN Clip.ScrapClear('',''); END;
  1366.                               v.bool := CatEdit.EditCut(ownTopWdw) |
  1367.       MausTauschrsc.tcopy   : IF CatEdit.IsEditTop(ownTopWdw) THEN
  1368.                                 IF ~CatGlobal.WithShift (kstate) THEN Clip.ScrapClear('',''); END;
  1369.                                 v.bool := CatEdit.EditCopy(ownTopWdw);
  1370.                               ELSIF msgList.listWindowTop (ownTopWdw)
  1371.                               THEN
  1372.                                 msgList.listCopy (ownTopWdw)
  1373.                               END; |
  1374.       MausTauschrsc.tpaste  : CatEdit.EditPaste (ownTopWdw) |
  1375.       MausTauschrsc.tselall : IF CatEdit.IsEditTop (ownTopWdw)
  1376.                               THEN
  1377.                                 CatEdit.MarkAll (ownTopWdw);
  1378.                               ELSIF msgList.listWindowTop (ownTopWdw)
  1379.                               THEN
  1380.                                 msgList.listSelectAll (ownTopWdw, TRUE);
  1381.                               ELSIF treeList.treeWindowTop (ownTopWdw)
  1382.                               THEN
  1383.                                 treeList.treeSelectAll (ownTopWdw);
  1384.                               ELSIF MsgWindow.msgWindowTop (ownTopWdw)
  1385.                               THEN
  1386.                                 MsgWindow.msgSelectAll (ownTopWdw);
  1387.                               END;|
  1388.       MausTauschrsc.blockrot: ProcessFilter (ownTopWdw, TRUE); |
  1389.       MausTauschrsc.blkprot : CatEdit.BlockProtect (ownTopWdw); |
  1390.       MausTauschrsc.writeblo: QuoteBlock(ownTopWdw, CatGlobal.WithShift(kstate)) |
  1391.       MausTauschrsc.infoline: WriteInfoline(ownTopWdw, kstate) |
  1392.       MausTauschrsc.findrepl: CatOpts.DoSearch() |
  1393.       MausTauschrsc.ttsagain: CatOpts.DoSearchAgain (kstate); |
  1394.       MausTauschrsc.brepl:    CatOpts.DoReplace (ownTopWdw) |
  1395.       MausTauschrsc.tchflag : IF grin.grinWindowTop (ownTopWdw)
  1396.                               THEN
  1397.                                 actSet := DialActionSet{ChangeMsg, ChangeTree, ChangeTreeDown};
  1398.                               ELSE
  1399.                                 actSet := DialActionSet{ChangeSelected};
  1400.                               END;
  1401.                               ConfVars.GetConfDefInt (cFlagSelection, v.int, 0);
  1402.                               lastAction := DialAction (v.int);
  1403.                               ConfVars.GetConfDefInt (cFlagSetBits, v.int, 0);
  1404.                               setBits := BITSET (v.int);
  1405.                               ConfVars.GetConfDefInt (cFlagClearBits, v.int, 0);
  1406.                               clearBits := BITSET (v.int);
  1407.                               IF FlagDial(actSet, setBits, clearBits, lastAction) THEN
  1408.                                 IF lastAction = ChangeMsg THEN
  1409.                                   grin.newStatus(ownTopWdw, clearBits, setBits);
  1410.                                 ELSIF lastAction = ChangeTree THEN
  1411.                                   grin.changeTree(ownTopWdw, clearBits, setBits, TRUE);
  1412.                                 ELSIF lastAction = ChangeTreeDown THEN
  1413.                                   grin.changeTree(ownTopWdw, clearBits, setBits, FALSE);
  1414.                                 ELSIF lastAction = ChangeSelected THEN
  1415.                                   IF msgList.listWindowTop (ownTopWdw)
  1416.                                   THEN
  1417.                                     msgList.listSetFlags (ownTopWdw, setBits, clearBits);
  1418.                                   ELSIF treeList.treeWindowTop (ownTopWdw)
  1419.                                   THEN
  1420.                                     treeList.treeSetFlags (ownTopWdw, setBits, clearBits);
  1421.                                   END;
  1422.                                 END;
  1423.                               END; |
  1424.       
  1425.       (* Nachrichten-Menu *)
  1426.       MausTauschrsc.tneue   : ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readnew); |  
  1427.       MausTauschrsc.tunread : ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readunread); |  
  1428.       MausTauschrsc.tlastpos: ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readpos); |  
  1429.       MausTauschrsc.tanfang : ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readall); |  
  1430.       MausTauschrsc.tdatum  : ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readdate); |  
  1431.       MausTauschrsc.tnummer : ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.readnum); |  
  1432.       MausTauschrsc.treadmsg: IF BMess THEN
  1433.                                 ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.stichwor); 
  1434.                               ELSE
  1435.                                 ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.messages);
  1436.                               END; |  
  1437.       MausTauschrsc.tnewallg: ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.newmess); |  
  1438.       MausTauschrsc.tnewpers: ButtonHandler (0, 0, {}, 0, {}, MausTauschrsc.newpers); |  
  1439.       MausTauschrsc.tresub  : WiederVorlage.SelectResub(); |
  1440.       MausTauschrsc.tsearch : IF grin.grinWindowTop (ownTopWdw)
  1441.                               THEN
  1442.                                 grin.SearchMenu(ownTopWdw) 
  1443.                               ELSIF msgList.listWindowTop (ownTopWdw)
  1444.                               THEN
  1445.                                 msgList.listSearch (ownTopWdw);
  1446.                               END; |
  1447.       MausTauschrsc.tmsagain: grin.DoSearch (ownTopWdw, ~CatGlobal.WithShift (kstate)) |
  1448.       MausTauschrsc.tsuchnb : grin.grinNextNotWorked(ownTopWdw, CatGlobal.WithShift(kstate))|
  1449.       
  1450.       (* Fenstermenu *)
  1451.       MausTauschrsc.cyclewin: WdwManager.TopNextWindow () |
  1452.       MausTauschrsc.fullwin : WdwManager.FullWindow (ownTopWdw); |
  1453.       MausTauschrsc.closeall: grin.grinCloseAll();
  1454.                               msgList.listCloseAll();
  1455.                               treeList.treeCloseAll();
  1456.                               buttonWindowLocked := TRUE;
  1457.                               v.bool := WdwManager.CloseAllWindows (FALSE); 
  1458.                               buttonWindowLocked := FALSE;
  1459.                               |
  1460.       MausTauschrsc.tbuttonw: ButtonWindowOpen := DisplayButton(FALSE) |            (* F7 *)
  1461.       MausTauschrsc.wstacked: WdwManager.ArrangeWindows (WdwManager.STACKED); |
  1462.       MausTauschrsc.wneben  : WdwManager.ArrangeWindows (WdwManager.BYSIDE); |
  1463.       MausTauschrsc.wstaffel: WdwManager.ArrangeWindows (WdwManager.OVERLAP); |
  1464.       MausTauschrsc.wtiled  : WdwManager.ArrangeWindows (WdwManager.TILED); |
  1465.       
  1466.       (* Tausch-Menu *)
  1467.       MausTauschrsc.makeein: IF UserBLK.security &
  1468.                                 (mtAlerts.Alert(1, makeInAlt) = 1) OR
  1469.                                  ~UserBLK.security
  1470.                              THEN
  1471.                                 v.bool := CreateInfile();
  1472.                              END; |
  1473.       MausTauschrsc.decode : IF UserBLK.security &
  1474.                                 (mtAlerts.Alert(1, insOutAlt) = 1) OR
  1475.                                 ~UserBLK.security
  1476.                              THEN
  1477.                                DecodeOutfile()
  1478.                              END; |
  1479.       MausTauschrsc.tterminal: StartTerminal(FALSE) |
  1480.       MausTauschrsc.abrufein: CatOpts.DoAbruf() |
  1481.       MausTauschrsc.infosein: CatOpts.DoInfos() |
  1482.       MausTauschrsc.tcallitk: v.bool := DoITK.SelectCmd() |
  1483.       MausTauschrsc.mgetuser: CatOpts2.DoUserSelect() |
  1484.       MausTauschrsc.tgrauswa: GruppenAuswahl.DoGroupSelect (groups) |
  1485.  
  1486.       (* Optionen-Menu *)
  1487.       MausTauschrsc.aoptions: CatOpts.DoOption () | (* allgemeine Einstellungen *) 
  1488.       MausTauschrsc.toptions: CatOpts.DoTausch (); | (* Tausch-Einstellungen *)
  1489.       MausTauschrsc.aprinter: CatOpts.doPrinter(); |
  1490.       MausTauschrsc.oliste  : CatOpts.doList(); |
  1491.       MausTauschrsc.akonfig : CatOpts.doConfig(); |
  1492.       MausTauschrsc.oiofilt : CatOpts2.doIOFilter(); |
  1493.       MausTauschrsc.aformats: CatOpts.doFormat(); |
  1494.       MausTauschrsc.ofloskel: CatOpts2.doFloskel(); |
  1495.       MausTauschrsc.ogroups : v.bool := ListHelp.SelectGroup (message, v.card, FALSE, TRUE, FALSE, ListHelp.gsmModify); |
  1496.       MausTauschrsc.efont   : WdwManager.GetTopWindow (ownTopWdw, hdl);
  1497.                               IF hdl > 0
  1498.                               THEN
  1499.                                 font := FontSelect.FontActive (hdl);
  1500.                                 FontSelect.FontInfo (hdl, font, fInfo);
  1501.                                 font := fInfo.id;
  1502.                                 size := fInfo.point;
  1503.                                 IF grin.grinWindowTop (ownTopWdw)
  1504.                                 THEN
  1505.                                   IF CatGlobal.WithShift (kstate)
  1506.                                   THEN
  1507.                                     grin.GetAlternativeFont (font, size);
  1508.                                     SelectFont(hdl, ownTopWdw, TRUE, font, size, grin.grinSetAlternativeFont);
  1509.                                     IF grin.grinWithEffects (ownTopWdw)
  1510.                                     THEN
  1511.                                       grin.GetWdwFont (ownTopWdw, font, size);
  1512.                                       FontSelect.SetFont (hdl, font, size, FALSE, v.bool, v.bool, v.int, v.int); 
  1513.                                     END;
  1514.                                   ELSE
  1515.                                     grin.GetWdwFont (ownTopWdw, font, size);
  1516.                                     SelectFont(hdl, ownTopWdw, FALSE, font, size, grin.grinSetFont);
  1517.                                     IF ~grin.grinWithEffects (ownTopWdw)
  1518.                                     THEN
  1519.                                       grin.GetAlternativeFont (font, size);
  1520.                                       FontSelect.SetFont (hdl, font, size, FALSE, v.bool, v.bool, v.int, v.int); 
  1521.                                     END;
  1522.                                   END;
  1523.                                 ELSIF CatEdit.IsEditTop (ownTopWdw)
  1524.                                 THEN
  1525.                                   SelectFont(hdl, ownTopWdw, FALSE, font, size, CatEdit.SelectEditFont);
  1526.                                 ELSIF msgList.listWindowTop (ownTopWdw)
  1527.                                 THEN
  1528.                                   SelectFont(hdl, ownTopWdw, FALSE, font, size, msgList.listSetFont);
  1529.                                 ELSIF MsgWindow.msgWindowTop (ownTopWdw)
  1530.                                 THEN
  1531.                                   SelectFont(hdl, ownTopWdw, FALSE, font, size, MsgWindow.msgSetFont);
  1532.                                 ELSIF treeList.treeWindowTop (ownTopWdw)
  1533.                                 THEN
  1534.                                   SelectFont(hdl, ownTopWdw, FALSE, font, size, treeList.treeSetFont);
  1535.                                 END;
  1536.                               END;
  1537.                               |
  1538.       MausTauschrsc.ocolor  : CatOpts.doColor (ownTopWdw); |
  1539.       MausTauschrsc.oeditor : CatOpts.doEditor (ownTopWdw); |
  1540.       
  1541.       MausTauschrsc.opsave  : IF UserBLK.security &
  1542.                                  (mtAlerts.Alert(1, saveCnfAlt) = 1) OR
  1543.                                  ~UserBLK.security
  1544.                               THEN
  1545.                                 CatUtil.WriteUserBlock();
  1546.                               END; |
  1547.  
  1548.     ELSE
  1549.  
  1550.   END;
  1551.   MagicAES.MenuTnormal(menu, title, MagicAES.Set);
  1552. END MenuMessageHandler;
  1553.  
  1554. (*----------------------------------------------*)
  1555.  
  1556. PROCEDURE HandleCommands (arg: ARRAY OF CHAR): BOOLEAN;
  1557. VAR z    : CARDINAL;
  1558.     o, d : BOOLEAN;
  1559. BEGIN
  1560.   batchProcess := TRUE;
  1561.   o := UserBLK.security; UserBLK.security := FALSE;
  1562.   FOR z := 1 TO SmallerCard(MagicStrings.Length(arg), 4) DO
  1563.     IF    MagicStrings.Cap(arg[z]) = 'I' THEN v.bool := MakeInFile();
  1564.     ELSIF MagicStrings.Cap(arg[z]) = 'T' THEN StartTerminal(TRUE);
  1565.     ELSIF MagicStrings.Cap(arg[z]) = 'O' THEN DecodeOutfile();
  1566.     ELSIF MagicStrings.Cap(arg[z]) = 'Q' THEN EndOfPrg := TRUE;
  1567.     END;
  1568.   END;
  1569.   UserBLK.security := o;
  1570.   batchProcess := FALSE;
  1571.   RETURN TRUE
  1572. END HandleCommands;
  1573.  
  1574. PROCEDURE HandleBatch():BOOLEAN;
  1575. VAR arg  : ARRAY[0..126] OF CHAR;
  1576.     z    : CARDINAL;
  1577.     o, d : BOOLEAN;
  1578.     i    : INTEGER;
  1579. BEGIN
  1580.   IF mtCommand.ParamCount() > 0 THEN
  1581.     mtCommand.ParamString(1, arg);
  1582.     IF arg[0] # '-' THEN
  1583.       mtCommand.ParamString(2, arg);
  1584.     END;
  1585.     IF arg[0] = '-' THEN
  1586.       RETURN HandleCommands (arg);
  1587.     END;
  1588.   END;
  1589.   RETURN FALSE
  1590. END HandleBatch;
  1591.  
  1592. PROCEDURE dummyProc():BOOLEAN;
  1593.   VAR cfgFile : CatTypes.String255;
  1594. BEGIN
  1595.   v.bool := TellLoadingBox (cInitConfig);
  1596.  
  1597.   (* Erstmal zurcksetzen auf TOS-Domain *)
  1598.   v.bool := Mintbind.Pdomain (0) = 0;
  1599.   
  1600.   (* Prfen, ob wir in der Mint-Domain laufen sollen *)
  1601.   ConfVars.GetConfDefBool (cMintDomain, v.bool, TRUE);
  1602.   IF v.bool
  1603.   THEN
  1604.     isMintDomain := Mintbind.Pdomain (1) = 0;
  1605.   ELSE
  1606.     v.bool := Mintbind.Pdomain (0) = 0;
  1607.     isMintDomain := FALSE;
  1608.   END;
  1609.  
  1610.   ReadUserBlock();
  1611.   CatGlobal.SetColors();
  1612.   IF ConfVars.GetConfigString (cPrtCfg, cfgFile)
  1613.   THEN
  1614.     v.bool := TellLoadingBox (cInitPrint);
  1615.     Printer.LoadCFGFile (cfgFile);
  1616.   END;
  1617.   v.bool := TellLoadingBox (cInitInfos);
  1618.   LoadInfoInf(FALSE, FALSE);
  1619.   RETURN InitVDIStandards();
  1620. END dummyProc;
  1621.  
  1622. PROCEDURE IsOn(item : INTEGER):BOOLEAN;
  1623. BEGIN
  1624.   RETURN ~(3 IN BITSET(GetState(menu, item)))
  1625. END IsOn;
  1626.  
  1627. PROCEDURE clickHandler (x, y : INTEGER; Button: BITSET; Clicks: INTEGER; kstate : BITSET);
  1628.   VAR wdw   : INTEGER;
  1629.       res   : INTEGER;
  1630.       popStr: ARRAY [0..79] OF CHAR;
  1631. BEGIN
  1632.   IF (1 IN Button) & ~(0 IN Button)
  1633.   THEN
  1634.     WdwManager.ClickInWindow (x, y, wdw);
  1635.     IF wdw >= 0
  1636.     THEN
  1637.       IF CatEdit.IsEditTop (wdw)
  1638.        & CatEdit.ClickIsInBlock (wdw, x, y)
  1639.        & (Clicks = 1)
  1640.       THEN
  1641.         IF grin.grinWindowTop (wdw)
  1642.         THEN
  1643.           popStr := " Kopieren | Filtern...";
  1644.           (* Testen, ob Topwindow Editorfenster ist *)
  1645.           IF ~grin.grinWindowTop (WdwManager.theTopWindow) 
  1646.              & CatEdit.IsEditTop (WdwManager.theTopWindow)
  1647.           THEN
  1648.             (* Quoten ist auch m”glich *)
  1649.             MagicStrings.Append ("| Quoten", popStr);
  1650.           END;
  1651.           res := mtPopups.PosPopup (x, y, popStr, "");
  1652.           CASE res OF
  1653.             0: v.bool := CatEdit.EditCopy (wdw); |
  1654.             1: ProcessFilter (wdw, FALSE); |
  1655.             2: QuoteBlock (WdwManager.theTopWindow, CatGlobal.WithShift (kstate)); |
  1656.           ELSE
  1657.           END;
  1658.         ELSE
  1659.           (* Normaler Editor ist Top *)
  1660.           popStr := " Einfgen | Ausschneiden | Kopieren | Filtern... | Schtzen";
  1661.           res := mtPopups.PosPopup (x, y, popStr, "");
  1662.           CASE res OF
  1663.             0: CatEdit.EditPaste (wdw); |
  1664.             1: v.bool := CatEdit.EditCut (wdw); |
  1665.             2: v.bool := CatEdit.EditCopy (wdw); |
  1666.             3: ProcessFilter (wdw, FALSE); |
  1667.             4: CatEdit.BlockProtect (wdw); |
  1668.           ELSE
  1669.           END;
  1670.         END;
  1671.       END;
  1672.     END;
  1673.   ELSE
  1674.     ButtonHandler(x, y, Button, Clicks, kstate, -1);
  1675.   END;
  1676. END clickHandler;
  1677.  
  1678. PROCEDURE keyHandler (scan, char : CHAR; moKState : BITSET): BOOLEAN;
  1679. CONST specialScans = CatTypes.charSet{155C,156C,157C,152C,153C,154C,147C,150C,151C,160C,
  1680.                  201C,170C,171C,172C,173C,174C,175C,176C,177C,200C};
  1681.       cursorScans  = CatTypes.charSet{110C, 113C, 115C, 120C};
  1682.       helpScan     = 142C;
  1683.   VAR num : INTEGER;
  1684.       val : ARRAY [0..511] OF CHAR;
  1685.       varName : ARRAY [0..39] OF CHAR;
  1686.       done: BOOLEAN;
  1687.       topWindow: INTEGER;
  1688. BEGIN
  1689.   WdwManager.GetOwnTopWindow (topWindow);
  1690.   done := FALSE;
  1691.   IF ((scan >= 73C) & (scan <= 104C))        (* ohne Shift *)
  1692.     OR  ((scan >= 124C) & (scan <= 135C))       (* mit Shift  *)
  1693.   THEN
  1694.     done := TRUE;
  1695.     IF ~mouse THEN
  1696.       mtAppl.MouseOn; mouse := TRUE;
  1697.     END;
  1698.     IF ~(CatGlobal.WithShift (moKState) OR CatGlobal.WithCtrl (moKState) OR CatGlobal.WithAlt (moKState))
  1699.     THEN
  1700.       CASE scan OF
  1701.         (* Funktionstasten, also ButtonHandler aufrufen! *)
  1702.         73C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readnew)|   (* F1 *)
  1703.         74C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readunread)|(* F2 *)
  1704.         75C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readpos)|   (* F3 *)
  1705.         76C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readall)|   (* F4 *)
  1706.         77C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readdate)|  (* F5 *)
  1707.         100C : ButtonHandler(0,0,{},0, {}, MausTauschrsc.readnum)|  (* F6 *)
  1708.         101C: ButtonWindowOpen := DisplayButton(FALSE)|            (* F7 *)
  1709.         102C: IF BMess THEN  
  1710.                 ButtonHandler(0,0,{},0, {}, MausTauschrsc.stichwor)
  1711.               ELSE
  1712.                 ButtonHandler(0,0,{},0, {}, MausTauschrsc.messages)
  1713.               END;|(* F8 *)
  1714.         103C: ButtonHandler(0,0,{},0, {}, MausTauschrsc.newmess)| (* F9 *)
  1715.         104C: ButtonHandler(0,0,{},0, {}, MausTauschrsc.newpers)  (* F10 *)
  1716.       ELSE
  1717.         done := FALSE;
  1718.       END
  1719.     ELSIF ~CatGlobal.WithCtrl (moKState) & CatGlobal.WithShift (moKState) & (scan >= 124C)
  1720.     THEN
  1721.       IF CatEdit.IsEditTop (topWindow) & (MagicAES.MUTIMER IN lastEvent)
  1722.       THEN
  1723.         (* mit Shift! *)
  1724.         num := INTEGER(ORD(scan)) - 84 + 1;
  1725.         Strings.Assign (cShiftFkey, varName, v.bool);
  1726.         Strings.Append (StrConv.IntToStr (num,0), varName, v.bool);
  1727.         IF ConfVars.GetConfigString (varName, val)
  1728.         THEN
  1729.           v.bool := CatEdit.PutLine (topWindow, ADR(val), LENGTH (val));
  1730.         END;
  1731.       END;
  1732.     ELSIF CatGlobal.WithCtrl (moKState) & ~CatGlobal.WithShift(moKState) & (scan <= 104C)
  1733.     THEN
  1734.       IF CatEdit.IsEditTop (topWindow) & (MagicAES.MUTIMER IN lastEvent)
  1735.       THEN
  1736.         (* mit Control! *)
  1737.         num := INTEGER(ORD(scan)) - 59 + 1;
  1738.         Strings.Assign (cCtrlFkey, varName, v.bool);
  1739.         Strings.Append (StrConv.IntToStr (num,0), varName, v.bool);
  1740.         IF ConfVars.GetConfigString (varName, val)
  1741.         THEN
  1742.           v.bool := CatEdit.PutLine (topWindow, ADR(val), LENGTH (val));
  1743.         END;
  1744.       END;
  1745.     ELSIF mayUseHidden & 
  1746.         CatGlobal.WithAlt(moKState) 
  1747.     THEN 
  1748.       IF (scan = 73C)   (* 73C *)
  1749.       THEN
  1750.         (* Alt-F1: 
  1751.          * Alle folgenden Nachrichten auf Gelesen setzen und zur n„chsten Gruppe 
  1752.          *)
  1753.          grin.hiddenFeature (topWindow, 0);
  1754.       ELSIF (scan = 74C)
  1755.       THEN
  1756.         (* Alt-F2: 
  1757.          * Alle Ungelesenen auf Gelesen setzen und zur n„chsten Gruppe
  1758.          *)
  1759.          grin.hiddenFeature (topWindow, 1);
  1760.       ELSIF (scan = 75C)
  1761.       THEN
  1762.         (* Alt-F3: 
  1763.          * Zur n„chsten Gruppe
  1764.          *)
  1765.          grin.hiddenFeature (topWindow, 2);
  1766.       ELSIF (scan = 76C)
  1767.       THEN
  1768.         (* Alt-F4: Fenster schliežen
  1769.          *)
  1770.         v.bool := WdwManager.CloseWindow (topWindow, FALSE);
  1771.       ELSE
  1772.         done := FALSE;
  1773.       END;
  1774.     END;
  1775. (*
  1776.   (* Jetzt die Ctrl-Shift-Shift-!Alt-Kombinationen *)
  1777.   ELSIF (scan = 132C) &
  1778.         ~CatGlobal.WithAlt(moKState) & CatGlobal.WithCtrl(moKState) &
  1779.         (MagicAES.KRSHIFT IN moKState) & (MagicAES.KLSHIFT IN moKState) THEN
  1780.     done := TRUE;
  1781.     UserBLK.watchBox := ~UserBLK.watchBox;
  1782.     v.bool := ConfVars.SetConfigBool (cWatchBox, UserBLK.watchBox);
  1783.  
  1784.     event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1785.     (* Shift-Shift-Ctrl F7: watchDog! *)
  1786.   ELSIF (scan = 133C) &
  1787.         ~CatGlobal.WithAlt(moKState) & CatGlobal.WithCtrl(moKState) &
  1788.         (MagicAES.KRSHIFT IN moKState) & (MagicAES.KLSHIFT IN moKState) THEN
  1789.     event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1790.     (* Shift-Shift-Ctrl-F8: Neue Ausgeben! *)
  1791.     j := mtAlerts.Alert(2, MTE.saveNew);
  1792.     IF j = 1 THEN NewOut('','')
  1793.     ELSIF j = 2 THEN
  1794.       CatGlobal.ApplPath(InPath);
  1795.       InSel := '';
  1796.       IF CatGlobal.FselGet(InPath, InSel, allWild, 'In welche Datei ausgeben?', FALSE) THEN
  1797.         NewOut(InPath, InSel);
  1798.       END
  1799.     END
  1800.   ELSIF (scan = 134C) &
  1801.         ~CatGlobal.WithAlt(moKState) & CatGlobal.WithCtrl(moKState) &
  1802.         (MagicAES.KRSHIFT IN moKState) & (MagicAES.KLSHIFT IN moKState) THEN
  1803.     UserBLK.InfoInSlider := ~UserBLK.InfoInSlider;
  1804.     v.bool := ConfVars.SetConfigBool ('InfoInSlider', UserBLK.InfoInSlider);
  1805.     
  1806.     event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1807.     (* Shift-Shift-Ctrl F9 *)
  1808.   ELSIF (scan = 135C) &
  1809.         ~CatGlobal.WithAlt(moKState) & CatGlobal.WithCtrl(moKState) &
  1810.         (MagicAES.KRSHIFT IN moKState) & (MagicAES.KLSHIFT IN moKState) THEN
  1811.     UserBLK.sortGroups := ~UserBLK.sortGroups;
  1812.     v.bool := ConfVars.SetConfigBool (cSortGroups, UserBLK.sortGroups);
  1813.     event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1814.     (* Shift-Shift-Ctrl F10 *)
  1815.   ELSIF CatGlobal.WithAlt(moKState) & (scan IN specialScans) THEN
  1816.     (* Handling fr ALT-0..9 fr Message-Abruf! *)
  1817.     event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1818.     IF    (scan = 160C) OR (scan = 201C) THEN t := 0
  1819.     ELSIF (scan = 155C) OR (scan = 170C) THEN t := 1
  1820.     ELSIF (scan = 156C) OR (scan = 171C) THEN t := 2
  1821.     ELSIF (scan = 157C) OR (scan = 172C) THEN t := 3
  1822.     ELSIF (scan = 152C) OR (scan = 173C) THEN t := 4
  1823.     ELSIF (scan = 153C) OR (scan = 174C) THEN t := 5
  1824.     ELSIF (scan = 154C) OR (scan = 175C) THEN t := 6
  1825.     ELSIF (scan = 147C) OR (scan = 176C) THEN t := 7
  1826.     ELSIF (scan = 150C) OR (scan = 177C) THEN t := 8
  1827.     ELSIF (scan = 151C) OR (scan = 200C) THEN t := 9 END;
  1828. *)
  1829. (* erstmal nichts.. *)
  1830.   ELSIF (scan = helpScan)
  1831.   THEN
  1832.     doHelp (topWindow, moKState);
  1833.   ELSE
  1834.     done := FALSE;
  1835.   END;
  1836.   RETURN done;
  1837. END keyHandler;
  1838.  
  1839. PROCEDURE OnlyWildcards (name: ARRAY OF CHAR): BOOLEAN;
  1840.   VAR i, l : INTEGER;
  1841. BEGIN
  1842.   l := LENGTH (name);
  1843.   i := 0;
  1844.   WHILE i < l DO
  1845.     IF ~(name[i] IN CatTypes.charSet {'*','?','.'})
  1846.     THEN RETURN FALSE
  1847.     END;
  1848.     INC (i);
  1849.   END;
  1850.   RETURN TRUE;
  1851. END OnlyWildcards;
  1852.  
  1853. PROCEDURE msgHandler (pBuf : ADDRESS; kstate : BITSET): BOOLEAN;
  1854.   VAR ch, scan : CHAR;
  1855.       moKState : BITSET;
  1856.       pName, pCmd : CatTypes.Str255Ptr;
  1857.       path : CatTypes.pathStrType;
  1858.       name : CatTypes.nameStrType;
  1859.       suff : CatTypes.extStrType;
  1860.       title, 
  1861.       item : INTEGER;
  1862.       wdw  : INTEGER;
  1863.       pBuff: POINTER TO ARRAY [0..15] OF INTEGER;
  1864.       done : BOOLEAN;
  1865.       evt  : BITSET;
  1866. BEGIN
  1867.   done := TRUE;
  1868.   pBuff := pBuf;
  1869.   CASE IsProtokoll(pBuff, kReturn, moKState, pName, pCmd) OF
  1870.     rNoproto :
  1871.       CASE pBuff^[0] OF
  1872.         MagicAES.MNSELECTED : 
  1873.             event := event - {MagicAES.MUBUTTON}; (* keine Buttons *)
  1874.             MenuMessageHandler(pBuff^[4], pBuff^[3], kstate); |
  1875.         MagicAES.APTERM : 
  1876.             IF saveAllPositions
  1877.             THEN
  1878.               EndOfPrg := CatUtil.WriteSavePos (TRUE, TRUE);
  1879.             END;
  1880.             fastExit := TRUE; 
  1881.             EndOfPrg := TRUE; |
  1882.         MagicAES.CHEXIT:
  1883.             (* Tochterprozež beendet *)
  1884.             IF (termPid > 0) & (pBuff^[3] = termPid)
  1885.             THEN
  1886.               (* Terminalprogramm beendet *)
  1887.               termPid := -1;
  1888.               IF pBuff^[4] = 0
  1889.               THEN
  1890.                 v.int := 0;
  1891.                 IF ConfVars.GetConfigInt (cWaitAfterTerm, v.int)
  1892.                 THEN
  1893.                   MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  1894.                   MagicAES.EvntTimer (LONGCARD(LONG(v.int)) * 1000L);
  1895.                   MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  1896.                 END;
  1897.                 (* Nur bei Exitcode 0 *)
  1898.                 IF UserBLK.DecodeAfterRun & 
  1899.                    ((UserBLK.security & 
  1900.                     (mtAlerts.Alert (1, "[2][CAT:|Terminalprogramm beendet!|Soll das Outfile jetzt|eingefgt werden?][[Ja|:[Nein]") = 1))
  1901.                     OR ~UserBLK.security)
  1902.                 THEN
  1903.                   DecodeOutfile()
  1904.                 END;
  1905.               END;
  1906.               IF ~batchProcess & ~EndOfPrg & termStarted
  1907.               THEN
  1908.                 WiederVorlage.CheckForResub();
  1909.                 termStarted := FALSE;
  1910.               END;
  1911.             END; |
  1912.         MagicAES.SCCHANGED:
  1913.             (* Clipboardinhalt hat sich ge„ndert *)
  1914.             Clip.ScrapIsDirty(); |
  1915.       ELSE
  1916.       END|
  1917.     rNone    : done := FALSE; |
  1918.     rChar    : SplitWordToByte(kReturn, scan, char);
  1919.                lastApId := pBuff^[1];
  1920.                
  1921.                IF MenuSearch(menu, mtAppl.ApplIdent, moKState, kReturn,
  1922.                              MenuMessageHandler, ~mouse) THEN
  1923.                  mouse := TRUE;
  1924.                  event := event - {MagicAES.MUKEYBD}; (* kein Keyboard *)
  1925.                ELSE
  1926.                  (* Event-Handler aufrufen mit MU_KEYBD *)
  1927.                  evt := {MagicAES.MUKEYBD};
  1928.                  done := WdwManager.HandleEvent (evt, pBuff^, {}, moKState,
  1929.                                                  char, scan, kReturn, 0, 0, 0);
  1930.                END; |
  1931.     (* Anderer Tastendruck wird evtl. bergemangelt.. *)
  1932.     rText    : WdwManager.GetOwnTopWindow (wdw);
  1933.                IF CatEdit.IsEditTop (wdw) & 
  1934.                   ~grin.grinWindowTop (wdw)
  1935.                THEN
  1936.                  SendAcknowledge (kReturn, CatEdit.PutLine (wdw, pName, (*SYSTEM.*)LENGTH (pName^)));
  1937.                ELSE
  1938.                  SendAcknowledge (kReturn, FALSE);
  1939.                END; |
  1940.     rStart   : mtDir.SplitPath(pName^, path, name, suff);
  1941.                IF (pCmd # NIL) THEN
  1942.                  v.int := StartPrg(path, name, pCmd^, TRUE, TRUE);
  1943.                  SendProgstart (v.int # 0);
  1944.                ELSE
  1945.                  suff := '';
  1946.                  v.int := StartPrg(path, name, suff, TRUE, TRUE);
  1947.                  SendProgstart (v.int # 0);
  1948.                END|
  1949.     rOpen    : (* Entweder AV_OPENWIND oder VA_START. Bei VA_START ist pName NIL!,
  1950.                 * und in pCmd steht eine Kommandozeile. Bei OpenWind steht in pName 
  1951.                 * der Pfad und in pCmd ein Dateiname.
  1952.                 *)
  1953.                IF pName # NIL
  1954.                THEN
  1955.                  (* AV_OPENWIND: Editor mit Datei ”ffnen *)
  1956.                  IF OnlyWildcards(pCmd^)
  1957.                  THEN
  1958.                    MagicStrings.Assign (pName^, openPath);
  1959.                    MagicStrings.Assign ('', openSel);
  1960.                    IF CatGlobal.FselGet(openPath, openSel, allWild, 'Datei laden', FALSE) 
  1961.                    THEN
  1962.                      OpenEditWindow(openPath, openSel, FALSE, FALSE);
  1963.                    END;
  1964.                  ELSE
  1965.                    OpenEditWindow(pName^, pCmd^, FALSE, FALSE);
  1966.                  END;
  1967.                ELSE
  1968.                  (* VA_START: pCmd enth„lt Kommandozeile *)
  1969.                  IF (pCmd # NIL) & (MagicStrings.Length (pCmd^) > 0)
  1970.                  THEN
  1971.                    (* Jetzt Kommandozeile auswerten: 
  1972.                     * entweder ist ein Dateiname enthalten oder sie f„ngt mit 
  1973.                     * - an und ist eine Kommandoliste
  1974.                     *)
  1975.                    IF pCmd^[0] # '-'
  1976.                    THEN
  1977.                      (* Ist wohl ein Dateiname, also INF laden *)
  1978.                      mtDir.SplitPath (pCmd^, CatGlobal.infPath, CatGlobal.infName, name);
  1979.                      ReadInfoDatei (FALSE, FALSE);
  1980.                    ELSE
  1981.                      (* Liste von Befehlen *)
  1982.                      v.bool := HandleCommands (pCmd^);
  1983.                    END;
  1984.                  ELSE 
  1985.                    (* Leere Kommandozeile, Fenster toppen *)
  1986.                    ButtonWindowOpen := DisplayButton (FALSE);
  1987.                  END;
  1988.                END;
  1989.                |
  1990.     rExtCatMsg:(* Erweiterte CAT-Nachricht *)
  1991.                CASE kReturn OF
  1992.                  CatReadMsgInfo : MsgWindow.msgUpdateInfo (); |
  1993.                ELSE
  1994.                END; |
  1995.   ELSE
  1996.     done := FALSE;
  1997.   END;
  1998.   RETURN done;
  1999. END msgHandler;
  2000.  
  2001. VAR crash : BOOLEAN;
  2002.  
  2003. (* Hier kommt jetzt der Crash-Handler *)
  2004. PROCEDURE crashHandler;
  2005.   (* Wird automatisch bei Terminierung des Programms aufgerufen *)
  2006. BEGIN
  2007.   mtAppl.MouseOn();
  2008.   v.int := MagicAES.MenuBar(menu, MagicAES.Reset);
  2009.   CloseButton(TRUE);
  2010.   IF saveAllPositions & crash
  2011.   THEN
  2012.     v.bool := CatUtil.WriteSavePos (fastExit, TRUE);
  2013.   ELSE
  2014.     grin.grinCloseAll ();
  2015.     msgList.listCloseAll();
  2016.     treeList.treeCloseAll();
  2017.     v.bool := WdwManager.CloseAllWindows (fastExit);
  2018.   END;
  2019.   msgList.listFreeAll();
  2020.   v.bool := data.WritePos();       (* Positionstabelle zurckschreiben *)
  2021.   IF UserBLK.autosave THEN CatUtil.WriteUserBlock() END; (* Userinfo schreiben               *)
  2022.   IF UserBLK.MakeAtEnd THEN v.bool := MakeInFile() END;
  2023.   v.bool := GroupSelect.SaveChangedGroupList();
  2024.   MausTauschrsc.RscFree();
  2025.   SendTerminate(TRUE);
  2026.   IF ~startTerm & minTos14 & ~neoDeskBugFix
  2027.   THEN
  2028.     v.int := MagicAES.ShelWrite(0,1,0, '', ''); (* Dann den ShelWrite zurcknehmen *)
  2029.   END;
  2030.   IF crash THEN Parser.EmergencyClose() END; (* catlog.txt schliežen *)
  2031.   ConfVars.CloseConfig ();                   (* catuser.req schliežen, falls offen *)
  2032.   MagicAES.WindUpdate(MagicAES.ENDUPDATE);
  2033.   mtAppl.ApplTerm(0);
  2034. END crashHandler;
  2035.  
  2036. PROCEDURE globalKeyHandler (kReturn: INTEGER; char, scan : CHAR; moKState : BITSET): BOOLEAN;
  2037.   VAR done : BOOLEAN;
  2038. BEGIN
  2039.   done := FALSE;
  2040.   IF (CatGlobal.WithCtrl (moKState) OR CatGlobal.WithAlt (moKState))
  2041.      & MenuSearch(menu, mtAppl.ApplIdent, moKState, kReturn,
  2042.                   MenuMessageHandler, ~mouse) THEN
  2043.     mouse := TRUE; (* Wird dann in MenuSearch gemacht *)
  2044.     RETURN TRUE;
  2045.   ELSE
  2046.     done := keyHandler (scan, char, moKState);
  2047.     IF mouse & ~(CatGlobal.WithCtrl (moKState) OR CatGlobal.WithAlt (moKState)) 
  2048.     & ~WdwManager.ModalWindowTop ()
  2049.     THEN
  2050.       IF dontSwitchOffMouse
  2051.       THEN
  2052.         dontSwitchOffMouse := FALSE
  2053.       ELSE
  2054.         mtAppl.MouseOff();
  2055.         mouse := FALSE;
  2056.       END;
  2057.     END;
  2058.   END;
  2059.   RETURN done;
  2060. END globalKeyHandler;
  2061.  
  2062. PROCEDURE handleEvents();
  2063.   VAR vdi : INTEGER;
  2064.       title, 
  2065.       item: INTEGER;
  2066. BEGIN
  2067.   ClearBuffer(event, FALSE, moKState, ORD(scan), char);
  2068.   
  2069.   (* Tastencodes mit Shift gehen immer zuerst an das Fenster! *)
  2070.   v.bool := WdwManager.HandleEvent (event, mess, moButton, moKState, char, scan, kReturn, moX, moY, bReturn);
  2071.   
  2072.   IF MagicAES.MUM1 IN event THEN
  2073.     IF ~mouse THEN
  2074.       mtAppl.MouseOn; mouse := TRUE; 
  2075.     END;
  2076.   END;
  2077.   IF MagicAES.MUBUTTON IN event THEN (* Button *)
  2078.     clickHandler (moX, moY, moButton, bReturn, moKState);
  2079.   END;
  2080.   IF ~mouse 
  2081.   THEN
  2082.     (* Feststellen, ob das Fenster uns geh”rt *)
  2083.     WdwManager.GetTopWindow (v.int, vdi);
  2084.     IF vdi <= 0
  2085.     THEN
  2086.       (* Fenster einer anderen Applikation ist oben, Maus anschalten *)
  2087.       mtAppl.MouseOn; mouse := TRUE;
  2088.     END;
  2089.   END;
  2090.   ButtonWindowOpen := CatButtons.WinHandle >= 0;
  2091. END handleEvents;
  2092.  
  2093. PROCEDURE CheckSingleCAT(): BOOLEAN;
  2094.   CONST     doubleAlert = '[3][CAT:|CAT oder CatPutz|ist schon gestartet.][[Abbruch]';
  2095.   VAR appName : CatTypes.String127;
  2096.       i       : INTEGER;
  2097.       otherId : INTEGER;
  2098. BEGIN
  2099.   IF multiTask
  2100.   THEN
  2101.     IF multiTOS OR (magIx & (magIxVer >= $200))
  2102.     THEN
  2103.       (* CAT mittels ApplSearch suchen *)
  2104.       FOR i := 0 TO 12 DO appName[i] := 0C; END;
  2105.       IF MagicAES.ApplSearch (MagicAES.APFIRST, appName, v.int, otherId)
  2106.       THEN
  2107.         REPEAT 
  2108.           Strings.DelTrailingBlanks (appName);
  2109.           IF (otherId # mtAppl.ApplIdent) & 
  2110.               (Strings.StrEqual(appName, 'CAT') OR
  2111.                Strings.StrEqual(appName, 'CATPUTZ'))
  2112.           THEN
  2113.             MTE.info (doubleAlert);
  2114.             (* Tja, leider ein anderes CAT gefunden *)
  2115.             RETURN FALSE
  2116.           END;
  2117.           FOR i := 0 TO 12 DO appName[i] := 0C; END;
  2118.         UNTIL ~MagicAES.ApplSearch (MagicAES.APNEXT, appName, v.int, otherId);
  2119.       END;
  2120.     ELSIF magIx
  2121.     THEN
  2122.       FOR i := 0 TO MagicAES.AESGlobal.apCount-1 DO
  2123.         IF i # mtAppl.ApplIdent
  2124.         THEN
  2125.           appName[0] := '?';
  2126.           appName[1] := 0C;
  2127.           appName[3] := 0C;
  2128.           appName[2] := CHR(i);
  2129.           IF (MagicAES.ApplFind (ADR(appName)) # 0) 
  2130.           THEN 
  2131.             Strings.DelTrailingBlanks (appName);
  2132.             IF Strings.StrEqual ('CAT', appName) OR
  2133.                Strings.StrEqual ('CATPUTZ', appName)
  2134.             THEN
  2135.               MTE.info (doubleAlert);
  2136.               RETURN FALSE
  2137.             END;
  2138.           END;
  2139.         END;
  2140.       END;
  2141.     END;
  2142.   END;
  2143.   RETURN TRUE;
  2144. END CheckSingleCAT;
  2145.  
  2146. (*$L-,R-,S-*)
  2147. PROCEDURE sigHandler();
  2148. BEGIN
  2149.   ASSEMBLER
  2150.     MOVE.W  #TRUE,fastExit
  2151.     MOVE.W  #TRUE,EndOfPrg
  2152.   END;
  2153. END sigHandler;
  2154. (*$L=,R=,S=*)
  2155.  
  2156. PROCEDURE installSignalHandler();
  2157. BEGIN
  2158.   IF MintUtil.IsMiNT()
  2159.   OR (magIx & (magIxVer >= $450))
  2160.   THEN
  2161.     (* Folgende Signale werden abgefangen und ignoriert:
  2162.      * SIGHUP, SIGINT, SIGSYS, 
  2163.      *)
  2164.     v.lbset := Mintbind.Psigblock (MagicSys.lBITSET{Mintbind.SIGHUP, Mintbind.SIGINT, Mintbind.SIGSYS});
  2165.     (* Folgende Signale werden mit Programmterminierung befolgt:
  2166.      * SIGQUIT, SIGPIPE, SIGTERM, SIGXCPU
  2167.      * Dabei ist es mir egal, ob die Installation geklappt hat oder nicht.
  2168.      *)
  2169.     v.a := Mintbind.Psignal (Mintbind.SIGTERM, ADDRESS (sigHandler));
  2170.     v.a := Mintbind.Psignal (Mintbind.SIGQUIT, ADDRESS (sigHandler));
  2171.     v.a := Mintbind.Psignal (Mintbind.SIGPIPE, ADDRESS (sigHandler));
  2172.     v.a := Mintbind.Psignal (Mintbind.SIGXCPU, ADDRESS (sigHandler));
  2173.   END;
  2174. END installSignalHandler;
  2175.  
  2176. PROCEDURE CheckWithAlt (VAR pressed: BOOLEAN);
  2177.   VAR wasPressed: BOOLEAN;
  2178. BEGIN
  2179.   wasPressed := pressed;
  2180.   MagicAES.GrafMkstate(moX, moY, moButton, moKState);
  2181.   IF MagicAES.KALT IN moKState THEN pressed := TRUE END;
  2182.   IF pressed & ~wasPressed
  2183.   THEN
  2184.     (* Bimmeln *)
  2185.     CatGlobal.Bing (7);
  2186.   END;
  2187. END CheckWithAlt;
  2188.  
  2189. VAR stck: MemArea;
  2190.     rHdl: TermCarrier;
  2191.  
  2192. (* Noch'n paar Variablen *)
  2193. VAR catName,
  2194.     catCmd,
  2195.     termName,
  2196.     params   : ARRAY [0..139] OF CHAR;
  2197.     p2, p    : INTEGER;
  2198.     configFileDa,
  2199.     fromTerm : BOOLEAN;
  2200.  
  2201.     vbuff    : ARRAY [0..15] OF INTEGER;
  2202.     menuName : ARRAY [0..15] OF CHAR;
  2203.     found    : BOOLEAN;
  2204.     altKeyPressed   : BOOLEAN;
  2205.     cd, ed   : LONGCARD;
  2206.  
  2207. BEGIN
  2208.   MagicDOS.Fsetdta (ADR(catDTA));
  2209.   isMintDomain := Mintbind.Pdomain (1) = 0;
  2210.   keyWrite := 0;
  2211.   keyRead  := 0;
  2212.   termPid  := -1;
  2213.   termStarted  := FALSE;
  2214.   chPid  := -1;
  2215.   filterNumber := 0;
  2216.   altKeyPressed := FALSE;
  2217.   mtDials.DialConfig (mtDials.UseConfig, FALSE);
  2218.  
  2219.   (* Bevor wir jetzt irgendetwas anderes machen, 
  2220.    * sorgen wir erstmal dafr, daž kein zweites CAT gestartet ist
  2221.    *)
  2222.   MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  2223.   IF ~CheckSingleCAT () THEN RETURN END;
  2224.  
  2225.  
  2226.   MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  2227.   installSignalHandler();
  2228.   crash := FALSE;
  2229.   null.d1  := 0; null.d2 := 0;
  2230.   CatGlobal.infPath[0] := 0C; CatGlobal.infName[0] := 0C;
  2231.   ButtonWindowOpen := FALSE;
  2232.   CatchProcessTerm (rHdl, crashHandler, stck);
  2233.  
  2234. (* Hier kann man sich ein:  mtAppl.ApplInit(); denken *)
  2235. (* Es wird neuerdings automatisch ausgefhrt..        *)
  2236.  
  2237.   mtAppl.MouseBusy;
  2238.  
  2239.   (* Hier jetzt noch Name von CAT ermitteln *)
  2240.   WinDials.SetApplicationName ('CAT');
  2241.   CatGlobal.SetAppl ('CAT');
  2242.   CatGlobal.GetApplPath (params);
  2243.   CatGlobal.ApplName (catName);
  2244.   Strings.Insert (params, 0, catName, v.bool);
  2245.  
  2246.   (* feststellen, ob wir vom Terminalprogramm aus
  2247.    * aufgerufen wurden
  2248.    *)
  2249.   (* Erste šberprfung auf Alternate-Taste *)
  2250.   CheckWithAlt (altKeyPressed);
  2251.   (* Jetzt CATPOS.INF lesen, falls da *)
  2252.   ConfVars.ConfigConfigModule (TRUE);
  2253.   (* Jetzt tempor„ren Pfad holen *)
  2254.   (* Hier mssen wir nachsehen, ob im TMP-Dir ein CATPOS.INF 
  2255.    * existiert. Wenn ja, dann nehmen wir das. Wenn nein, dann 
  2256.    * versuchen wir es nochmal mit dem Applikationpath
  2257.    *)
  2258.   found := FALSE;
  2259.   IF mtCommand.EnvVar ('TMP', params) & (LENGTH (params) > 0)
  2260.   THEN
  2261.     IF params[LENGTH(params)-1] # '\'
  2262.     THEN
  2263.       (* ggf. Backslash anh„ngen *)
  2264.       Strings.Append ('\', params, v.bool);
  2265.     END;
  2266.     Strings.Append (CatUtil.tmpInf, params, v.bool);
  2267.     v.lcard := FileSize (params, found);
  2268.   END;
  2269.   IF ~found 
  2270.   THEN
  2271.     CatGlobal.ApplPath (params);
  2272.     Strings.Append (CatUtil.tmpInf, params, v.bool);
  2273.     v.lcard := FileSize (params, found);
  2274.   END;
  2275.   (* CATPOS.INF lesen *)
  2276.   IF ConfVars.ReadConfigFile (params)
  2277.   THEN
  2278.     configFileDa := TRUE;
  2279.     v.bool := MagicDOS.Fdelete (params);
  2280.     fromTerm := ConfVars.GetConfigString (cOverlayTerm, TerminalName);
  2281.     IF ConfVars.GetConfigString (cLastInfName, lastInfName)
  2282.     THEN
  2283.       mtDir.SplitPath (lastInfName, CatGlobal.infPath, CatGlobal.infName, menuName);
  2284.     END;
  2285.   ELSE
  2286.     fromTerm := FALSE;
  2287.     configFileDa := FALSE;
  2288.   END;
  2289.   (* Und wieder auf normale Einstellung *)
  2290.   ConfVars.ConfigConfigModule (FALSE);
  2291.   CatGlobal.ApplPath (params);
  2292.   (* Erstmal Aufl”sung testen *)
  2293.   IF (mtAppl.MaxWidth DIV mtAppl.CharWidth) < 80
  2294.   THEN
  2295.     mtAppl.MouseArrow;
  2296.     j := mtAlerts.Alert(1, '[3][CAT:|Die gew„hlte Aufl”sung ist|zu gering fr CAT!][[Ciao]');
  2297.     (* wird im crashhandler wieder ausgeschaltet *)
  2298.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  2299.   ELSIF ~MausTauschrsc.RscInit() 
  2300.   THEN
  2301.     mtAppl.MouseArrow;
  2302.     j := mtAlerts.Alert(1, '[3][CAT:|CAT.RSC nicht gefunden!][[Ciao]');
  2303.     (* wird im crashhandler wieder ausgeschaltet *)
  2304.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);    
  2305.   ELSIF InitLoadingBox(cInitInf) &
  2306.         ReadInf(CatGlobal.infPath, CatGlobal.infName, fromTerm, TRUE) &
  2307.         dummyProc() &
  2308.         TellLoadingBox (cInitGroups) &
  2309.         GroupSelect.ReadGroupList() &
  2310.         TellLoadingBox (cInitData) &
  2311.         data.InitDataBase() &
  2312.         TellLoadingBox (cInitGrin) &
  2313.         grin.grinInit() &
  2314.         TellLoadingBox (cInitRsc) &
  2315.         InitRsc() & 
  2316.         TellLoadingBox (cInitClip) &
  2317.         Clip.GetScrap (params)
  2318.   THEN
  2319.     (* Prfen, wie die Alerts aussehen sollen *)
  2320.     ConfVars.GetConfDefBool (cWinAlerts, v.bool, FALSE);
  2321.     WinDials.AlertsInWindow (v.bool);
  2322.  
  2323.     (* Wiedervorlageliste lesen *)
  2324.     v.bool := WiederVorlage.ReadResubList();
  2325.   
  2326.     (* Zweite šberprfung auf Alternate-Taste *)
  2327.     CheckWithAlt (altKeyPressed);
  2328.  
  2329.     (* Menubar bei Windowmanager anmelden *)
  2330.     WdwManager.InstallGlobalMenu (menu, msgHandler);
  2331.  
  2332.     (* Keyboardhandler bei Windowmanager anmelden *)
  2333.     WdwManager.InstallGlobalKeyProc (globalKeyHandler);
  2334.  
  2335.     (* Fr die FlagBox *)
  2336.     setBits := {}; clearBits := {}; lastAction := ChangeMsg;
  2337.  
  2338. (* kann bei den folgenden etwas schieflaufen ?? *)
  2339.     v.bool := TellLoadingBox (cInitDials);    ListHelp.Init(gruppen, adr);
  2340.     grinTools.Init(wegen, system);
  2341.     CatGlobal.SetColors();
  2342.           
  2343.     WdwManager.EnableIconify (TRUE);
  2344.     WdwManager.SetWindowIcon (MausTauschrsc.TreeAddr^[MausTauschrsc.cat_icon]);
  2345.  
  2346.     IF MagicCookie.FindCookie (magicPCCookie, v.lcard) 
  2347.     THEN
  2348.       ConfVars.GetConfDefBool (cMagicPCKeys, v.bool, TRUE);
  2349.       IF v.bool
  2350.       THEN
  2351.         WdwManager.SetMagicPCKeyTranslation (TRUE);
  2352.       END;
  2353.     END;
  2354.  
  2355.     IF ConfVars.GetConfigBool(cSortNames, v.bool) & v.bool
  2356.     THEN
  2357.       v.bool := TellLoadingBox (cInitNames);
  2358.       data.SortList (data.names);
  2359.     END;
  2360.     
  2361.     (* Feststellen, ob der NeoDeskFix aktiv sein soll *)
  2362.     neoDeskBugFix := ConfVars.GetConfigBool (cNeoDeskFix, v.bool) & v.bool;
  2363.   
  2364.     IF multiTOS OR (magIx & (magIxVer >= $300))
  2365.     THEN
  2366.       (* MultiTOS *)
  2367.       MagicStrings.Assign ('  Cat ', menuName);
  2368.       MagicStrings.Append (CatTypes.CatVersion, menuName);
  2369.       v.int := MagicAES.MenuRegister (mtAppl.ApplIdent, menuName);
  2370.       (* Und auch Bescheid sagen, daž wir AP_TERM verstehen *)
  2371.       v.int := MagicAES.ShelWrite (MagicAES.InformAES, INTEGER(BITSET{MagicAES.ApTermBit}), 0, "", "");
  2372.     END;
  2373.  
  2374.     v.bool := TellLoadingBox (cInitMsgMan);
  2375.     MsgWindow.InitMessageManager();
  2376.     v.bool := TellLoadingBox (cInitList);
  2377.     msgList.InitMsgList();
  2378.  
  2379.     ConfVars.GetConfDefBool (cReadMess, BMess, TRUE);
  2380.     mtUtils.SetState(desk, MausTauschrsc.stichwor, MagicAES.SELECTED, ~BMess);
  2381.     mtUtils.SetState(desk, MausTauschrsc.messages, MagicAES.SELECTED, BMess);
  2382.     CheckItem (menu, MausTauschrsc.treadmsg, ~BMess);
  2383.     v.bool := TellLoadingBox (cInitButton);
  2384.     InitButtonWindow();
  2385.     FreeLoadingBox ();
  2386.     
  2387.     (* Setzen des Zeilenaufbaus fr die Stichwortliste *)
  2388.     (* catCmd wird nicht mehr benutzt, kann ich hier tempor„r benutzen *)
  2389.     ConfVars.GetConfDefStr (cPrivateLine, catCmd, CatTypes.cPrivateDefault);
  2390.     msgList.SetListLine(catCmd, TRUE);
  2391.     ConfVars.GetConfDefStr (cGlobalLine, catCmd, CatTypes.cGlobalDefault);
  2392.     msgList.SetListLine(catCmd, FALSE);
  2393.     ConfVars.GetConfDefBool (cHiddenFeatures, mayUseHidden, FALSE);
  2394.     
  2395.     (* Ende Init-Prozeduren *)
  2396.  
  2397.     (* crash wird zurckgesetzt bei normalem Ende *)
  2398.     crash := TRUE;
  2399.     
  2400.     MagicStrings.Assign (MessagePath, openPath);
  2401.     openSel[0] := 0C;
  2402.  
  2403.     MagicStrings.Assign(MessagePath, CatGlobal.SavePath);
  2404.     CatGlobal.ApplPath (CatGlobal.prgPath);
  2405.     
  2406.     EndOfPrg := FALSE;
  2407.  
  2408.     (* Hier jetzt die XACC-Initialisierung fr MTOS *)
  2409.     ProtoInit();
  2410.  
  2411.     WdwManager.HandlePendingEvents();    (* k”nnte auch reichen fr Watchdog!! *)
  2412.     MagicAES.WindUpdate(MagicAES.BEGUPDATE); (* wg. sofort wieder aus.. *)
  2413.  
  2414.     ConfVars.GetConfDefBool (cSavePos, saveAllPositions, FALSE);
  2415.     v.bool := ConfVars.SetConfigBool (cSavePos, saveAllPositions);
  2416.  
  2417.     startTerm := FALSE;
  2418.     fastExit := FALSE;   (* Gibt an, ob ohne Rckfrage beendet werden soll (Aufl”sungswechsel unter MultiTOS) *) 
  2419.     
  2420.     IF ~HandleBatch() THEN
  2421.       startTerm := UserBLK.StartTermAtStart & ~fromTerm;
  2422.       (* Dritte und letzte šberprfung auf Alternate-Taste *)
  2423.       CheckWithAlt (altKeyPressed);
  2424.       IF altKeyPressed THEN startTerm := ~startTerm END;
  2425.       IF startTerm & ~fromTerm THEN 
  2426.         (* wieder l”schen, kann in StartTerminal neu gesetzt 
  2427.          * werden fr Overlaystart! *)
  2428.         startTerm := FALSE; 
  2429.         StartTerminal(FALSE); 
  2430.       ELSE
  2431.         (* is' doch schon..? 
  2432.          * Ne, ist nicht, kann ja auch fromTerm sein! *)
  2433.         startTerm := FALSE; 
  2434.       END;
  2435.  
  2436.       IF ~EndOfPrg & ((UserBLK.DecodeAtStart &
  2437.          (~startTerm OR
  2438.            startTerm & ~UserBLK.DecodeAfterRun))
  2439.          OR (fromTerm & UserBLK.DecodeAfterRun)) THEN
  2440.         DecodeOutfile()
  2441.       END;
  2442.     ELSE
  2443.       IF EndOfPrg & saveAllPositions 
  2444.       THEN
  2445.         v.bool := CatUtil.WriteSavePos (fastExit, TRUE);
  2446.       END;
  2447.     END;
  2448.  
  2449.     IF ~EndOfPrg THEN
  2450.       ButtonWindowOpen := DisplayButton (TRUE);
  2451.  
  2452.       IF configFileDa
  2453.       THEN
  2454.         ConfVars.ConfigConfigModule (TRUE);
  2455.   
  2456.         (* Alles wieder restaurieren *)
  2457.         MsgWindow.msgRestorePos();
  2458.         grin.grinRestorePos();
  2459.         msgList.listRestorePos();
  2460.         CatEdit.EditRestorePos();
  2461.         ConfVars.DeleteAllVars();
  2462.         ConfVars.ConfigConfigModule (FALSE);
  2463.       END;
  2464.       WdwManager.HandlePendingEvents();    (* k”nnte auch reichen fr Watchdog!! *)
  2465.       v.bool := mtAESMenus.InitMenuline (menu);
  2466.       v.int := MagicAES.MenuBar(menu, MagicAES.Set);    (* show our menubar          *)
  2467.   
  2468. (* ---------------------------------------------------------------------- *)
  2469.       mtAppl.MouseArrow;
  2470.       mouse := TRUE;
  2471.       WITH mrect DO
  2472.         x := 0; y := 0; w := 1; h := 1;
  2473.       END;
  2474.     END;
  2475.  
  2476.     (* Prozedur-Handler in WdwManager installieren *)
  2477.     WdwManager.handleNewTop := enableNewTop;
  2478.     event := {};
  2479.  
  2480.     IF ~batchProcess & ~EndOfPrg & ~termStarted
  2481.     THEN
  2482.       WiederVorlage.CheckForResub ();
  2483.     END;
  2484.  
  2485.     WHILE ~EndOfPrg DO
  2486.  
  2487.       enableMenuItems (WdwManager.theTopWindow);
  2488.       MagicAES.WindUpdate(MagicAES.ENDUPDATE);
  2489.       
  2490.       mtAppl.MouseState (v.int, mouse);
  2491.  
  2492.       IF PendingKey()
  2493.       THEN
  2494.         event := {MagicAES.MUKEYBD};
  2495.         PopKey(moKState, scan, char);
  2496.       ELSE
  2497.         (* Zuerst mal die Arrays setzen *)
  2498.         (* Vielleicht nochmal eigene Array, das bringt vielleicht noch mal _etwas_,
  2499.            ist aber auch noch aufwendiger.. *)
  2500.         IF mouse THEN
  2501.           MagicAES.AESIntIn[0] := INTEGER({MagicAES.MUKEYBD, MagicAES.MUBUTTON, MagicAES.MUMESAG, MagicAES.MUTIMER});
  2502.         ELSE
  2503.           MagicAES.AESIntIn[0] := INTEGER({MagicAES.MUKEYBD, MagicAES.MUBUTTON, MagicAES.MUM1, MagicAES.MUMESAG, MagicAES.MUTIMER});
  2504.         END;
  2505.   
  2506.         (* Rechte und Linke Maustaste abfragen *)
  2507.         (* Geht in jeder TOS-Version und ist nun dokumentiert *)
  2508.         MagicAES.AESIntIn[1]  := 259;
  2509.         MagicAES.AESIntIn[2]  := INTEGER({1,0});
  2510.         MagicAES.AESIntIn[3]  := INTEGER({});
  2511.         MagicAES.AESIntIn[4]  := MagicAES.LeaveRect;
  2512.         WITH mrect DO
  2513.           MagicAES.AESIntIn[5]  := x;
  2514.           MagicAES.AESIntIn[6]  := y;
  2515.           MagicAES.AESIntIn[7]  := w;
  2516.           MagicAES.AESIntIn[8]  := h;
  2517.         END;
  2518.         (*
  2519.         MagicAES.AESIntIn[9]  := 0;
  2520.         MagicAES.AESIntIn[10] := 0;
  2521.         MagicAES.AESIntIn[11] := 0;
  2522.         MagicAES.AESIntIn[12] := 0;
  2523.         MagicAES.AESIntIn[13] := 0;
  2524.         
  2525.         *)
  2526.         MagicAES.AESIntIn[14] := 350;   (* ev_mtlocount: 350 ms *)
  2527.         MagicAES.AESIntIn[15] := 0;     (* ev_mthicount: 0 *)
  2528.         
  2529.         MagicAES.AESAddrIn[0] := ADR(mess);
  2530.         
  2531.         lastEvent := event;
  2532.         event := MagicAES.EvntPmulti();
  2533.   
  2534.         moX := MagicAES.AESIntOut[1];
  2535.         moY := MagicAES.AESIntOut[2];
  2536.         moButton := MagicSys.CastToBitset(MagicAES.AESIntOut[3]);
  2537.         moKState := MagicSys.CastToBitset(MagicAES.AESIntOut[4]);
  2538.         kReturn  := MagicAES.AESIntOut[5];
  2539.         SplitWordToByte(kReturn, scan, char);
  2540.         bReturn  := MagicAES.AESIntOut[6];
  2541.   
  2542.         WITH mrect DO
  2543.           x := moX; y := moY;
  2544.         END;
  2545.       END;
  2546.  
  2547.       MagicAES.WindUpdate(MagicAES.BEGUPDATE);
  2548.  
  2549.       IF MagicAES.MUBUTTON IN event THEN (* Button *)
  2550.         IF ~mouse THEN
  2551.           mtAppl.MouseOn; mouse := TRUE; 
  2552.         END;
  2553.         IF MagicAES.MouseLeft IN moButton THEN
  2554.           (* Nicht warten, wenn man die rechte Taste gedrckt hat. *)
  2555.           (* Sonst kann man Fenster im Hintergrund nicht mehr korrekt bedienen. *)
  2556.           (* Warten auf loslassen oder waitingTime *)
  2557.           e := MagicAES.EvntMulti(
  2558.                      {MagicAES.MUBUTTON, MagicAES.MUTIMER},
  2559.                       0,{1,0},{}, 0,dr, 0, dr, vbuff, UserBLK.waitingTime,0,
  2560.                       v.int, v.int, v.bset, v.int, v.bset, v.int, v.char, v.int);
  2561.         END;
  2562.       END;
  2563.       handleEvents();
  2564.  
  2565.     END; (* WHILE ~EndOfPrg *)
  2566.  
  2567. (* ---------------------------------------------------------------------- *)
  2568.     crash := FALSE;
  2569.     IF startTerm & ~fastExit
  2570.     THEN
  2571.       (* Terminalprogramm mittels ShelWrite starten *)
  2572.       Strings.Concat (TerminalPath, TerminalName, termName, v.bool);
  2573.       
  2574.       (* Dateinamen zusammensetzen in altem Konfigbereich *)
  2575.       CatUtil.GetPosPath (params);
  2576.       Strings.Append (CatUtil.tmpInf, params, v.bool);
  2577.       (* Variable setzen und rausschreiben *)
  2578.       ConfVars.GetConfDefBool (cSetAppName, v.bool, FALSE);
  2579.       ConfVars.ConfigConfigModule (TRUE);
  2580.       v.bool := ConfVars.SetConfigBool (cSetAppName, v.bool);
  2581.       v.bool := ConfVars.SetConfigString (cOverlayTerm, termName);
  2582.       v.bool := ConfVars.SetConfigString (cLastInfName, lastInfName);
  2583.       CatUtil.isTmp := TRUE;
  2584.       v.bool := ConfVars.WriteConfigFile (params, CatUtil.writeInfo);
  2585.       ConfVars.ConfigConfigModule (FALSE);
  2586.       
  2587.       (* Parameterzeile basteln *)
  2588.       params := ' '; (* Platz fr L„nge! *)
  2589.       Strings.Append (TerminalCmd, params, v.bool);
  2590.       Strings.Append ('/', params, v.bool);
  2591.       Strings.Append (catName, params, v.bool);
  2592.       params[0] := CHR(Strings.Length (params)-1);
  2593.       (* Und los geht's *)
  2594.       v.bool := SetPath (TerminalPath);
  2595.       IF TerminalPath[1] = ':' THEN
  2596.         MagicStrings.Delete (TerminalPath, 0, 2);
  2597.         v.bool := SetPath (TerminalPath);
  2598.       END;
  2599.       v.int := MagicAES.ShelWrite (1, 1, 0, termName, params);
  2600.     END;
  2601.   ELSE
  2602.     FreeLoadingBox ();
  2603.     SendTerminate(TRUE);
  2604.     (* Wird im CrashHandler wieder ausgeschaltet *)
  2605.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  2606.   END;
  2607. END Cat.
  2608.